home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / BODI / RESOURCE.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-10  |  107.4 KB  |  4,240 lines

  1. /**************************************************************************/
  2. /*  FILE:  RESOURCE.C        PROGRAM TITLE: DeskSET II Alpha Version   */
  3. /*  Date Created: 12/15/87                          */ 
  4. /*  Last Modified: 01/27/89                          */
  5. /*                                      */
  6. /*  Description: RESOURCE, DIALOG BOXES, ALERT BOXES ROUTINES          */
  7. /*  Routines:   o   open_resource()  - Gaddr Resources and Display Menu   */
  8. /*        o   do_pagenum()     - Handle page icon              */
  9. /*        o   draw_book()         - Draw book icon              */
  10. /*        o   close_resource() - Hides Menu Bar and Frees Resource  */
  11. /*        o   execform()       - Put up a dialog box.               */
  12. /*        o   get_int()         - Ascii ob_spec to int          */
  13. /*        o   set_int()         - Put int to ASCII ob_spec           */
  14. /*        o   get_float()         - ASCII ob_spec to float          */
  15. /*        o   set_float()         - Put float to ASCII ob_spec      */
  16. /*        o   draw_fbox()         - Draw fill box in graphics dialog      */
  17. /*        o   draw_lbox()         - Draw line box in graphics dialog   */
  18. /*        o   do_grdialog()    - Handle graphics attribute dialog   */
  19. /*        o   hndl_box()         - Handle box once object is found    */
  20. /*        o   do_point_size()  - Set Point Size              */
  21. /*        o   do_scoffset()    - Scan offset Dialog Handler      */
  22. /*        o   do_go_page()     - Set Current Page Number...      */
  23. /*        o   do_font_info()   -                     */
  24. /*        o   get_image()         - Setup to load images dialog      */
  25. /*        o   update_point_dialog() Setup font info          */
  26. /*        o   init_artobj()    - Initialize Article Selector box      */
  27. /*        o   deselect()         - Deselect all objects of the article*/
  28. /*        o   init_slider()    - Initialize slider size in box      */
  29. /*        o   get_num_arts()   - Return # of articles in memory      */
  30. /*        o   do_slider()         - Move slider in slider box      */
  31. /*        o   do_artobj()         -                       */
  32. /*        o   hndl_abox()         - Handle the article box          */
  33. /*        o   hndl_list()         - Handle font selection list      */
  34. /*        o   scroll()         -                      */
  35. /*        o   set_artobj()     -                      */
  36. /*        o   do_unit_dialog() - Handle changing units of measure   */
  37. /*         o   do_grid_space()  - Select grid spacing dialog      */
  38. /*        o   do_page_def()    - Page Type Selection Dialog        */
  39. /*        o   do_clip_dialog() - Handle clipping of icons          */
  40. /*        o   do_rcoord()         - Typed coordinates of a region      */
  41. /*        o   do_set_paths()   - Handle Default Path dialog      */
  42. /*        o   set_tedit()         - Insert Text in Text Dialog Field   */
  43. /*        o   get_edit()         - Get Text from Editable Text Field  */
  44. /*        o   do_pcoord()         - Typed coordinates of a primitive   */
  45. /*         o   set_template()   - Handle template usage dialog box   */
  46. /*        o   page_numbering() - Handle page numbering dialog box   */
  47. /*        o   do_dpi()         - Handle user defined dpi ...      */
  48. /**************************************************************************/
  49.  
  50.  
  51. /**************************************************************************/
  52. /* HISTORY                                  */
  53. /*                                      */
  54. /* 11/02/89    - Set_Text_Defaults()                      */
  55. /*          The Font UID number is now initialized according to the */
  56. /*          UID number of the FIRST font of the 16 fonts in the      */
  57. /*          current dress file.                      */
  58. /*          B4, it slammed it to #1 which is incorrect.          */
  59. /*                                      */
  60. /* 11/02/89    - do_point_size()                      */
  61. /*          If the UID number in gltxtattr.font does not exist      */
  62. /*          among one of the 16 fonts in the current dress file,    */
  63. /*          the FONT NAME will be blank and the FONT UID # of the   */
  64. /*          requested UID number will be displayed. The user can    */
  65. /*           also scroll among the 16 other fonts + this blank one   */
  66. /*          See the code as to how it works.              */
  67. /*          B4, if the UID # didn't exist, the FONT NAME would've   */
  68. /*          been the first font in the dress and the UID # would've */
  69. /*          been either 0 or 1                      */
  70. /*                                      */
  71. /* 11/02/89    - page_numbering()                      */
  72. /*          Changes made for the exact same reasons as the      */
  73. /*          do_point_size bug.                      */
  74. /*                                      */
  75. /* 11/03/89    - Changed page numbering dialog box routines to ALWAYS    */
  76. /*          number pages from EXISTING MIN PAGE to EXISTING MAX PAGE*/
  77. /*          This is checked upon entry to the routine. B4, the user */
  78. /*          specified the range which was never automatically       */
  79. /*          updated.                          */
  80. /*          Routine touched: page_numbering()              */
  81. /*                                      */
  82. /* 11/07/89    - Convert all calls form scale_v() to scaler()          */
  83. /*        - hndl_abox() - replace scale_v() with scaler()          */
  84. /*        - do_info()   - replace scale_v() with scaler()          */
  85. /*                                      */
  86. /* 11/07/89    - Replace all vmutopix() calls with vmupix()          */
  87. /*          do_point_size() - replace vmutopix() with vmupix()      */
  88. /**************************************************************************/
  89.  
  90. /**************************************************************************/
  91. /* INCLUDE FILES                              */
  92. /**************************************************************************/
  93. #include "define.h"
  94. #include "deskset2.h"
  95. #include "gemdefs.h"
  96. #include <obdefs.h>
  97. #include "osbind.h"
  98. #include "alert.h"
  99. #include "dbase.h"
  100.  
  101.  
  102.  
  103. /**************************************************************************/
  104. /* DEFINES                                  */
  105. /**************************************************************************/
  106.  
  107.                     /* From FTMGR.C              */
  108. #define        SFTSIZ    1548        /* Size of font              */
  109. #define        TFNOFS     15        /* Offset to Typeface name      */
  110. #define     INFOMAX 10        /* info dialog box slots      */
  111.  
  112. #define DINFO struct dinfo
  113.  
  114. struct dinfo
  115. {
  116.    char  txtptr[40];
  117.    DINFO *next;
  118.    DINFO *prev;
  119. };
  120.  
  121.  
  122. /**************************************************************************/
  123. /* EXTERNALS                                  */
  124. /**************************************************************************/
  125. extern int splane;
  126. extern int sxres,syres;                /* screen x and y rez     */
  127. extern int xbook,ybook;                /* book icon position      */
  128.  
  129. extern int shandle;                /* screen handle      */
  130. extern int prev_handle;                 
  131. extern int pageside;                
  132.  
  133. extern int gl_lstyle;                /* graphic attributes     */
  134. extern int gl_lwidth;                /* like..line width      */
  135. extern int gl_fstyle;                /* Fill style          */
  136. extern int gl_findex;                /* fill index          */
  137. extern int gl_repel;                /* graphic repel?      */
  138. extern int gl_repbounds;            
  139. extern int gl_repoffset;
  140.  
  141. extern int scale_set;
  142. extern int view_size;                /* what view scale on scrn*/
  143.  
  144. extern int zdevice;                /* device drawing to...   */
  145. extern int SH;                    /* height of scan...      */
  146. extern unsigned long gl_region_ptr;        /* Text region pointer    */
  147. extern unsigned long gl_grregion_ptr;        /* graphic region pointer */
  148. extern unsigned long region_ptr;        /* region pointer      */
  149.  
  150. extern int curr_page;                /* current page number    */
  151. extern int mode_change;                /* display or not...      */
  152.  
  153. extern int cur_pic_type;            /* current pic type       */
  154. extern int (*funcs)();
  155. extern int nada();
  156. extern char fbuffer[];                /* file name buffer...    */
  157. extern int opwidth,opheight;
  158. extern int graph_flag;
  159. extern int opwidth,opheight;
  160. extern int force_draw_flag;
  161.  
  162. extern    int    gl_hchar;
  163. extern    int    gl_wchar;
  164. extern  int     ptsin[];            /* ptsin array...      */
  165.  
  166. extern  long    getf_article();            /* extern declarations    */
  167. extern  long    getn_article();
  168. extern  char    *get_artfname();
  169.  
  170. extern struct txtattr gltxtattr;        /* global text attributes */
  171. extern int glgrattr[];                /* global graphic attrib  */
  172. extern char pathbuf[];                /* path...          */
  173.  
  174. extern int txt_handle;                /* text window handle     */
  175. extern int prev_handle;                /* preview window handle  */
  176. extern int unit_type;                /* current unit of measure*/
  177.  
  178. extern int dummy;
  179.  
  180. typedef struct dta                /* dta for file i/o      */
  181. {
  182.      char res[21];
  183.      char attr;
  184.      int  time;
  185.      int  date;
  186.      long fsize;
  187.      char str[14];
  188. } DTA;
  189.  
  190. extern DTA thedta;                /* store DTA info here!  */
  191. extern int hgridspace,vgridspace;        /* h and v grid space    */
  192. extern int pagetype;                
  193. extern int pagemux[];
  194. extern int pagemuy[];
  195.  
  196. extern int hpage_size;                /* h and v size in mu's  */
  197. extern int vpage_size;
  198. extern int pxy[];                /* global vertices...    */
  199. extern int cur_scale;
  200.  
  201. extern GRECT dpwork;                /* Actual preview work area*/
  202. extern GRECT pwork;                /* Total preview work area */
  203. extern GRECT page_area;             /* GRECT area Preview area */
  204.  
  205. extern char *gcvt();
  206. extern int article_flag;
  207. extern long bufpath;
  208.  
  209. extern int active_prim;            /* flag if prim is active  */
  210. extern long prim_ptr;            /* ptr to current primitive*/
  211. extern int wmode;
  212. extern long get_curreg();
  213.  
  214. extern int tmplate_flag;
  215. extern int disp_type;            /* display template- BOTH,LEFT,RIGHT*/
  216. extern int disp_pos;            /* display template-FRONT,BACK      */
  217.  
  218. extern PNUMBER pnum;            /* page number structure        */
  219. extern double get_float();
  220.  
  221. extern int axdpi[];            /* array for xdpi            */
  222. extern int aydpi[];            /* array for ydpi            */
  223. extern int half_xdpi[];            /* array for half of x dpi        */
  224. extern int half_ydpi[];            /* array for half of y dpi        */
  225. extern int xdpi[];            /* GO Graphics xdpi array        */
  226. extern int ydpi[];            /* GO Graphics ydpi array        */
  227.  
  228. extern long MALLOC();
  229.  
  230. extern unsigned long scan_bytes;    /* number of bytes in scan buffer   */
  231. extern unsigned long prev_bytes;    /* number of bytes in preview buff  */
  232. extern unsigned long scanptr,scanesc;   /* pointers to scan buffer        */
  233. extern unsigned long page_ptr,pagesc;    /* pointers to preview buffer       */
  234.  
  235. extern int scan_xres;            /* x and y resolution of scan buff  */
  236. extern int scan_yres;
  237.  
  238. extern int sdevm;
  239. extern int mhandle;            /* preview workstation handle     */
  240. extern int intout[];
  241. extern int mxres,myres;            /* current xy res of preview buff */
  242. extern FDB page_MFDB;            /* Preview MFDB area          */
  243. extern unsigned char *get_lmem();
  244. extern long pagebytes;
  245. extern PAGE *curpage;
  246. extern int multi_mode;
  247. extern long first_aregion();
  248. extern long get_regart();
  249. extern long get_lcmem();
  250.  
  251. extern int Pval;    /* parmcheck() result value */
  252.  
  253. extern int ruler_flag;
  254. extern int show_grids;
  255. extern int snap_to_grids;
  256. extern int grid_space;
  257.  
  258. extern int bgmono2[];
  259. extern int bgmed1[];
  260. extern int bgmed2[];
  261.  
  262. extern ARTICLE *arthd;
  263. extern ARTICLE *tarthd;
  264. extern PAGE *pagehd;
  265. extern PAGE *tpagehd;
  266.  
  267. extern int ptsarray[];
  268. extern long get_fregion();
  269. extern long get_nregion();
  270. extern long get_fpage();
  271. extern long get_npage();
  272. extern PAGE *left_tmplate;
  273. extern PAGE *right_tmplate;
  274. extern ARTICLE *rtarthd;
  275. extern ARTICLE *ltarthd;
  276.  
  277. extern DINFO *set_info_graphics();
  278. extern PAGE *clippage;
  279. extern ARTICLE *curart;
  280. extern char *winfo[][4];
  281.  
  282. extern DINFO *get_grfname();
  283.  
  284. /**************************************************************************/
  285. /* GLOBAL VARIABLES                              */
  286. /**************************************************************************/
  287. char rscerr[]  = "[3][ Unable to Locate Resource!][OK]";
  288. char rscerr1[] = "[3][ Preview Functions Disabled.][OK]";
  289. char rscerr2[] = "[1][ Printing Functions Disabled.][OK]";
  290. char rscerr3[] = "[3][ Delete all regions?][OK|CANCEL]";
  291. char linkerr[] = "[3][ This Region is already| linked to an article.][OK]";
  292. char del_page[]= "[3][ Delete Page? ][OK|CANCEL]";
  293. char delregion[]="[3][ Delete Region? ][OK|CANCEL]";
  294. char not_found[]="[1][ File Not Found! ][CONTINUE]";
  295. char dprint[]   ="[2][ Commence Printing? ][OK|CANCEL]";
  296. char scanerr[] = "[3][ Unable to Open|Scanner Workstation!][EXIT DESKSET]";
  297. char preverr[] = "[3][ Unable to Open|Preview Workstation!][EXIT DESKSET]";
  298. char quiter[]  = "[3][ Do you really want to QUIT? ][QUIT|CANCEL]";
  299.  
  300. char *gtype[] = {
  301.               ".NEO",
  302.           ".IMG",
  303.           ".GEM",
  304.           ".PI1"
  305.             };
  306.  
  307.  
  308. char *grid_inch[] =
  309. {
  310.    "1/8 inch",
  311.    "1/4 inch",
  312.    "1/2 inch",
  313.    "1 inch"
  314. };
  315. char *grid_cents[] =
  316. {
  317.    "1/2 centimeter",
  318.    "1 centimeter",
  319.    "2 centimeters",
  320.    "3 centimeters"
  321. };
  322. char *grid_picas[] =
  323. {
  324.    "1 pica",
  325.    "2 picas",
  326.    "3 picas",
  327.    "4 picas"
  328. };
  329.  
  330. char *grid_cicero[] =
  331. {
  332.    "1 ciceros",
  333.    "2 ciceros",
  334.    "3 ciceros",
  335.    "4 ciceros"
  336. };
  337.  
  338.  
  339. char *rcoord_unit[] = 
  340. {
  341.    " Inches      ",
  342.    " Picas       ",
  343.    "Centimeters  ",
  344.    " Ciceros     "
  345. };
  346.  
  347. char *dpagenum[] = {
  348.             " Distance From Top Of Page:   ",
  349.             " Distance From Bottom Of Page:"
  350.            };
  351.  
  352.  
  353.  
  354. /* all are based upon 1301 mu per Horizontal inch         */
  355. /*               1156 mu per Vertical inch           */
  356. /* These are based on the 1301 and 1156 mus            */ 
  357. /*
  358. int hinch_mus[] = {163,325,651,1301};     * inches        *
  359. int vinch_mus[] = {145,289,578,1156};   * 1/8 1/4 1/2 1     *
  360.  
  361. int hcent_mus[] = {256,512,1024,1537};  * 1/2, 1,2,3          *
  362. int vcent_mus[] = {228,455,910,1365};   * 2.54 cm == 1 inch *
  363.  
  364. int hpica_mus[] = {217,434,651,867};    * 1,2,3,4  picas    *
  365. int vpica_mus[] = {193,385,651,771};    * 6 picas == 1 inch *
  366. */
  367.  
  368.  
  369.  
  370. /* These numbers are based upon 1296 and 1152 mus    */
  371. int hinch_mus[] = {162,324,648,1296}; /* inches      */
  372. int vinch_mus[] = {144,288,576,1152}; /* 1/8 1/4 1/2 1  */
  373.  
  374. int hcent_mus[] = {255,510,1020,1531}; /* Centimeters   2.54 cm == 1 inch*/
  375. int vcent_mus[] = {227,454,907,1361};  /* 1/2, 1 2 3 */
  376.  
  377. int hpica_mus[] = {216,432,648,864}; /* 1,2,3,4 picas     */
  378. int vpica_mus[] = {192,384,576,768}; /* 6 picas == 1 inch */
  379.  
  380. int hcicero_mus[] = {231,462,693,924};  /* 1,2,3,4  */
  381. int vcicero_mus[] = {205,410,615,820};    /* ciceros hasn't been touched */
  382.  
  383. OBJECT *ad_menu;                /* Address of menu object */
  384. OBJECT *ad_deskset;                /* Address of About object*/
  385. OBJECT *ad_bkgrnd;                /* Address of BKGRND objct*/
  386. OBJECT *ad_point_size;                /* Set Font Size      */
  387. OBJECT *ad_go_page;                /* Goto page #          */
  388. OBJECT *ad_get_image;
  389. OBJECT *ad_grattr;
  390. OBJECT *artobj;
  391. OBJECT *unitobj;
  392. OBJECT *gridspace;
  393. OBJECT *adpagedef;
  394. OBJECT *adoutput;
  395. OBJECT *adclipobj;
  396. OBJECT *ad_scanoff;
  397. OBJECT *ad_rcoord;
  398. OBJECT *ad_paths;
  399. OBJECT *ad_pcoord;
  400. OBJECT *ftmenu;
  401. OBJECT *ad_settmpl;
  402. OBJECT *ad_pagenum;
  403. OBJECT *ad_autoflow;
  404. OBJECT *ad_dpi;
  405. OBJECT *ad_credits;
  406. OBJECT *ad_info;
  407. OBJECT *ad_filebuf;
  408.  
  409. int maxpat;                /* Graphic screen device limits   */
  410. int maxhatch;
  411. int maxlwidth;
  412. int maxlstyles;
  413.  
  414.  
  415. char    tmpflname[14] = {"________.___"};
  416.  
  417. #define PAGESIZ 8
  418.  
  419. int    aworkx;
  420. int    aworky;
  421. int    aworkw;
  422. int    aworkh;
  423.  
  424.  
  425. int    curfirst_art;        /* beginning of font list */
  426. int    hslider;        /* vertical slider height */
  427. char    pagestr[10];
  428. int *clipe;
  429. int *icdata;
  430. ICONBLK *icnptr;
  431. BITBLK *bgicptr;
  432.  
  433. double atof();
  434. char *pathptr;
  435. char *get_edit();
  436.  
  437. char *dpath1;        /* Pointers to Default paths for Text..*/
  438. char *dpath2;        /* clipboard,Graphics and Docs         */
  439. char *dpath3;        /* in that order...               */
  440. char *dpath4;
  441.  
  442. char pnumtext[PTEXTMAX];
  443. int pstorage[51];    /*******************************************/
  444.             /* int array storage for default parameters*/
  445.             /* Default Save Parameters Format...       */
  446.             /* Base Zero, but of course...           */
  447.             /* (0)  int Preview Size - 50%,100% etc... */
  448.             /* (1)  int Ruler Display - On/Off       */
  449.             /* (2)  int Ruler Units - Metric etc...    */
  450.             /* (3)  int Grid Spacing - Units Etc..     */
  451.             /* (4)  int Grid Display - On/Off          */
  452.             /* (5)  int Snap To Grid - On/Off       */
  453.             /* (6)  int DPI Setting  - X dpi       */
  454.             /* (7)  int DPI Setting  - Y dpi       */
  455.             /* (8)  int Global Font Number           */
  456.             /* (9)  int Global Point Size           */
  457.             /* (10) int Global Set Size           */
  458.             /* (11) int Global Line Space - in Mu's    */
  459.             /* (12) int Kerning - On/Off           */
  460.             /* (13) int Reverse Video - On/Off       */
  461.             /* (14) int Justification           */
  462.             /* (15) int Paper Type - A4,B5,Letter,Legal*/
  463.             /* (16) int Scan Offset - In mu's       */ 
  464.             /* (17) int Fill Type  - Pattern/Hatch     */
  465.             /* (18) int Fill Index               */
  466.             /* (19) int Line Style               */
  467.             /* (20) int Line Width               */
  468.             /* (21) int Repel Mode               */
  469.             /* (22) int Repel Bounds           */
  470.             /* (23) int Boundary Offset           */
  471.             /* (24) int Page Number Font           */
  472.             /* (25) int Page Number Point Size       */
  473.             /* (26) int Page Number Set Size       */
  474.             /* (27) int Page Number Display           */
  475.             /* (28) int Page Number Left Page Just     */
  476.             /* (29) int Page Number Right Page Just    */
  477.             /* (30) int Page Usage               */
  478.             /* (31) int Page Number Vertical Position  */
  479.             /* (32) int Page Number Distance - in Mu's */
  480.             /* (33) int Page Number From---           */
  481.             /* (34) int Page Number To---           */
  482.             /* (35) int Template Usage - Both,Left,Rt  */
  483.             /* (36) int Template Display Location      */
  484.             /* (37) int Manual char. Compensation       */
  485.             /* (38) int Auto. Char Compensation       */
  486.             /* (39) int Hyphenation flag           */
  487.             /* (40) int No. of Sucessive Hyphens       */
  488.             /* (41) int No. of chars Before Hyphen       */
  489.             /* (42) int No. of chars AFter Hyphen       */
  490.             /* (43) int Letterspacing Mode flag        */
  491.             /* (44) int Positive Letter Space in RU    */
  492.             /* (45) int Negative Letter SPace In RU    */
  493.             /* (46) int Minimum Space in RU           */
  494.             /* (47) int Preferred Space In RU       */
  495.             /* (48) int Maximum Space In RU           */
  496.             /* (49) int Pseudo Italic Mode Flag       */
  497.             /* (50) int # of Chars in Page Text       */
  498.             /* (X) char Page Number Text              */
  499.             /* Null                       */
  500.             /*******************************************/
  501.  
  502.  
  503. int *primicons;
  504.  
  505. int info_what;     /* info dialog box - DOC,TEMPLATE,orCLIPBOARD 0,1,2*/
  506. int info_type;   /* info dialog box - TEXT or GRAPHIC - 0,1         */ 
  507.  
  508.  
  509. DINFO *tdinfo_ptr;    /* pointer to first node of text info structure DOC*/
  510. DINFO *gdinfo_ptr;      /* pointer to first node of graphic info struct DOC*/
  511.  
  512. DINFO *ttdinfo_ptr;    /* ptr to first node of text info in template       */
  513. DINFO *tgdinfo_ptr;    /* ptr to first node of graphic info in template   */
  514.  
  515. DINFO *ctdinfo_ptr;    /* empty - null on purpose               */
  516. DINFO *cgdinfo_ptr;    /* ptr to first node of graphic info in clipboard  */
  517.  
  518. int dtcount;        /* number of doc text items.               */
  519. int dgcount;        /* number of doc graphic items             */
  520.  
  521. int ttcount;        /* number of template text items           */
  522. int tgcount;        /* number of template graphic items           */
  523.     
  524. int ctcount;        /* number of clipboard text items - always zero    */
  525. int cgcount;        /* number of clipboard graphic items            */
  526.  
  527. int maincount;        /* number of items in DINFO structure-for active struct*/
  528. DINFO *curdinfo;    /* current dinfo pointer               */
  529.  
  530. ARTICLE *xarthd;    /* temp for testing in set_dtmplate() */
  531.  
  532. int attr_flag[23];    /* attribute flags - 0 if not changed, 1 if changed*/
  533. struct txtattr tmpattr; /* temporary txt attributes structure            */
  534.  
  535.  
  536. /**************************************************************************/
  537. /* Function:    open_resource()                          */
  538. /* Description: Gets Address of Resource objects and displays menu bar.   */
  539. /**************************************************************************/
  540. open_resource()
  541. {
  542.     int fullx,fully,fullw,fullh;
  543.  
  544.     rsrc_gaddr(0,MENU,&ad_menu);        /* menu...        */
  545.     rsrc_gaddr(0,DESKSET,&ad_deskset);        /* About Dialog   */
  546.     rsrc_gaddr(0,BKGRND,&ad_bkgrnd);
  547.     rsrc_gaddr(0,FONTSIZE,&ad_point_size);
  548.     rsrc_gaddr(0,GOPAGE,&ad_go_page);
  549.     rsrc_gaddr(0,PICTYPE,&ad_get_image);
  550.     rsrc_gaddr(0,GRATTR,&ad_grattr);
  551.     rsrc_gaddr(0,ARTSEL,&artobj);
  552.     rsrc_gaddr(0,MEASURE,&unitobj);
  553.     rsrc_gaddr(0,GRIDSP,&gridspace);
  554.     rsrc_gaddr(0,PAGESIZE,&adpagedef);
  555.     rsrc_gaddr(0,OUTPUT,&adoutput);
  556.     rsrc_gaddr(0,CLIPTREE,&adclipobj);
  557.     rsrc_gaddr(0,SCANOFF,&ad_scanoff);
  558.     rsrc_gaddr(0,REGCOORD,&ad_rcoord);
  559.     rsrc_gaddr(0,PATHS,&ad_paths);
  560.     rsrc_gaddr(0,PRMCOORD,&ad_pcoord);
  561.     rsrc_gaddr(0,FONTMAN,&ftmenu);
  562.     rsrc_gaddr(0,SETTMPL,&ad_settmpl);
  563.     rsrc_gaddr(0,PAGENUMS,&ad_pagenum);
  564.     rsrc_gaddr(0,AUTOFL,&ad_autoflow);
  565.     rsrc_gaddr(0,DOTS,&ad_dpi);
  566.     rsrc_gaddr(0,CREDITS,&ad_credits);
  567.     rsrc_gaddr(0,DOCINFO,&ad_info);
  568.     rsrc_gaddr(0,FILEBUF,&ad_filebuf);
  569.  
  570.     wind_get(0,WF_WORKXYWH,&fullx,&fully,&fullw,&fullh);
  571.     ad_bkgrnd[0].ob_x         = fullx;
  572.     ad_bkgrnd[0].ob_y       = fully;
  573.     ad_bkgrnd[0].ob_width   = fullw;
  574.     ad_bkgrnd[0].ob_height  = fullh;
  575.     ad_bkgrnd[BOOKOBJ].ob_x = xbook;
  576.     if(splane == 2)    /* color med res */
  577.         ad_bkgrnd[BOOKOBJ].ob_y = ybook - 3;
  578.     else
  579.     ad_bkgrnd[BOOKOBJ].ob_y = ybook - 11;
  580.     ad_bkgrnd[CLIPOBJ].ob_y = ybook - 16;
  581.     ad_bkgrnd[CLIPOBJ].ob_x = xbook - ad_bkgrnd[BOOKOBJ].ob_width - 10;
  582.  
  583.     set_int(adoutput,OCOPIES,1);
  584.     set_int(adoutput,OTOPAGE,1);
  585.     set_int(adoutput,OFROMPAG,1);
  586.  
  587.     icnptr = ad_bkgrnd[CLIPOBJ].ob_spec;
  588.     bgicptr = ad_bkgrnd[BGICON].ob_spec;
  589.     
  590.     clipe = icnptr->ib_pdata;
  591.     if(splane == 2)                /* medium res */
  592.     {
  593.         bgicptr->bi_pdata = bgmed1;
  594.     icdata = bgmed1;
  595.     primicons = bgmed2;
  596.         bgicptr->bi_wb = 0x0008;        /* 8 bytes across */
  597.     bgicptr->bi_hl = 0x00c1;
  598.     }
  599.     else
  600.     {
  601.         icdata = bgicptr->bi_pdata;        /* at least hi resolution */
  602.     primicons = bgmono2;
  603.     }
  604.     do_pagenum(1,1);                /* Page 1, 0 = left side */
  605.     form_dial(0,0,0,0,0,0,16,sxres,syres-16);
  606.     wind_set(0,WF_NEWDESK,ad_bkgrnd,0,0);
  607.     objc_draw(ad_bkgrnd,ROOT,MAX_DEPTH,0,fully,sxres,syres);
  608.     
  609.     ad_menu[TEXT].ob_state = DISABLED;
  610.     menu_bar(ad_menu,TRUE);
  611.     menu_ienable(ad_menu,AAUTOFL,FALSE);
  612. }
  613.  
  614.  
  615. /**************************************************************************/
  616. /* Function: get_range()                          */
  617. /* Description: Get rang efor autoflow pages...                  */
  618. /**************************************************************************/
  619. get_range(min,max)
  620. int *min;
  621. int *max;
  622. {
  623.    int button;
  624.  
  625.    set_int(ad_autoflow,AFFROM,0);
  626.    set_int(ad_autoflow,AFTO,0);
  627.    button = execform(ad_autoflow,AFFROM);
  628.    ad_autoflow[button].ob_state = NORMAL;
  629.    *min = get_int(ad_autoflow,AFFROM);
  630.    *max = get_int(ad_autoflow,AFTO);
  631.    if(button == AFOK)
  632.     return(1);
  633.    else
  634.     return(0);
  635. }
  636.    
  637.  
  638.  
  639. /**************************************************************************/
  640. /* Function: do_pagenum()                          */
  641. /* Description: Handles the book icon                      */
  642. /**************************************************************************/
  643. do_pagenum(num,side)
  644. int num;
  645. int side;
  646. {
  647.    register ICONBLK *icnptr;
  648.    register int width;
  649.    int height;
  650.    int tflag;
  651.  
  652.    icnptr = ad_bkgrnd[BOOKOBJ].ob_spec;
  653.    width = ad_bkgrnd[BOOKOBJ].ob_width;
  654.    height = ad_bkgrnd[BOOKOBJ].ob_height;
  655.    icnptr->ib_wtext = 18;
  656.    icnptr->ib_htext = 6;
  657.    icnptr->ib_ytext = height/4;            /* one fourth down screen */    
  658.    if(!side)                    /* LEFT side  */
  659.    {
  660.     pageside = 0;
  661.     icnptr->ib_xtext = width/8;
  662. /*        pagestr[0] = 'L';*/
  663.     strcpy(pagestr,"L  ");
  664.    } 
  665.    else
  666.    {
  667.     pageside = 1;
  668.     icnptr->ib_xtext = (5*width)/8;
  669. /*        pagestr[0] = 'R';*/
  670.     strcpy(pagestr,"R  ");
  671.    }
  672.  
  673.    if(!tmplate_flag)
  674.        itoa(num,pagestr);
  675.    icnptr->ib_ptext = pagestr;
  676.    draw_book();
  677.  
  678.    if(ad_menu[RCLOSE].ob_state == 0x0)
  679.    {
  680.      tflag = article_flag;
  681.      article_flag = TRUE;
  682.          close_region();
  683.      article_flag = tflag;
  684.      if(!article_flag)
  685.         graf_mouse(0,&dummy);    /* arrow then... */
  686.    }
  687.  
  688. }
  689.  
  690.  
  691.  
  692.  
  693. /**************************************************************************/
  694. /* Function: draw_book()                          */
  695. /* Description: Draw the book icon                      */
  696. /**************************************************************************/
  697. draw_book()
  698. {
  699. int x,y,w,h;
  700.        wind_get(prev_handle,WF_CURRXYWH,&x,&y,&w,&h);
  701.        if(x + w >= xbook && y + h >= ybook)
  702.         return;
  703.        wind_get(txt_handle,WF_CURRXYWH,&x,&y,&w,&h);
  704.        if(x + w >= xbook && y + h >= ybook)
  705.         return;
  706.        Vsync();
  707.        objc_draw(ad_bkgrnd,BOOKOBJ,1,xbook,ybook,
  708.         sxres - xbook,syres - ybook);   
  709. }
  710.  
  711.    
  712.  
  713. /**************************************************************************/
  714. /* Function:    close_resource()                      */
  715. /* Description: Closes menu bar and releases resources.              */
  716. /**************************************************************************/
  717. close_resource()
  718. {
  719.     menu_bar(ad_menu,FALSE);
  720.     form_dial(3,0,0,0,0,0,16,sxres,syres-16);    
  721.     rsrc_free();
  722. }
  723.  
  724.  
  725.  
  726. /**************************************************************************/
  727. /* Function:     execform()                          */
  728. /* Description:  Put up a Dialog Box                      */
  729. /* IN:  the_tree   - tree OBJECT                      */
  730. /*      crsr_pos   - object to place cursor on...              */
  731. /* OUT: returns button pressed.                          */
  732. /**************************************************************************/
  733. execform(the_tree,crsr_pos)
  734. register OBJECT the_tree[];
  735. int    crsr_pos;            
  736. {
  737.   int x,y,w,h;
  738.   int button;
  739.  
  740.         active_prim = FALSE;
  741.       form_center(the_tree,&x,&y,&w,&h);
  742.       the_tree[0].ob_x = x + 3;
  743.     the_tree[0].ob_y = y + 3;
  744.     form_dial(0,0,0,36,36,x,y,w,h);
  745.     form_dial(1,0,0,36,36,x,y,w,h);
  746.     objc_draw(the_tree,0,MAX_DEPTH,x,y,w,h);
  747.     button = form_do(the_tree,crsr_pos);
  748.     form_dial(2,0,0,36,36,x,y,w,h);
  749.     form_dial(3,0,0,36,36,x,y,w,h);  
  750.     return(button);
  751. }
  752.  
  753.  
  754.  
  755. /**************************************************************************/
  756. /* Function:     get_int()                          */
  757. /* Description:  Convert ob_spec ascii to int                  */
  758. /* IN:  tree  - address of OBJECT                      */
  759. /*      obj   - object in question                      */
  760. /* OUT: returns integer                              */
  761. /**************************************************************************/
  762. get_int(tree,obj)
  763. OBJECT *tree;
  764. int obj;
  765. {
  766.      long *str1;
  767.  
  768.      str1 = tree[obj].ob_spec;
  769.      return(atoi(*str1));
  770. }
  771.  
  772.  
  773.  
  774. /**************************************************************************/
  775. /* Function:     set_int()                          */
  776. /* Description:  Inserts an ascii string into the dialog box.          */
  777. /* IN:  tree  - address OBJECT of tree in question              */
  778. /*    obj   - object in dialog box in question              */
  779. /*    num   - number to insert                      */
  780. /* OUT: none                                    */
  781. /**************************************************************************/
  782. set_int(tree,obj,num)
  783. OBJECT *tree;
  784. int obj;
  785. int num;
  786. {
  787.      char str[4];
  788.      long *str1;
  789.  
  790.      itoa(num,str);
  791.      str1 = tree[obj].ob_spec;
  792.      strcpy(*str1,str);
  793. }
  794.  
  795.  
  796.  
  797. /**************************************************************************/
  798. /* Function: get_float()                          */
  799. /* Description: ASCII ob_spec to float                      */
  800. /**************************************************************************/
  801. double get_float(tree,obj)
  802. OBJECT *tree;
  803. int obj;
  804. {
  805.      long *str1;
  806.  
  807.      str1 = tree[obj].ob_spec;
  808.      return(atof(*str1));
  809. }
  810.  
  811.  
  812.  
  813. /**************************************************************************/
  814. /* Function: set_float()                          */
  815. /* Description: float to ASCII ob_spec                      */
  816. /**************************************************************************/
  817. set_float(tree,object,num)
  818. OBJECT *tree;
  819. int object;
  820. double num;
  821. {
  822.    char str[64];
  823.    long *str1;
  824.    char *s;
  825.  
  826.    s = gcvt(num,4,str);
  827.    str1 = tree[object].ob_spec;
  828.    strcpy( *str1,s);
  829. }
  830.  
  831.  
  832.  
  833.  
  834.  
  835. /**************************************************************************/
  836. /* Function: draw_fbox()                          */
  837. /* Description: Draw Fill box in graphical dialog              */
  838. /**************************************************************************/
  839. draw_fbox(patmode)
  840. int patmode;
  841. {
  842.    int pxyarray[4];
  843.    register int styleflag;
  844.    int xpos,ypos;
  845.  
  846.    objc_offset(ad_grattr,FBOX,&xpos,&ypos);
  847.    
  848.    if(patmode)
  849.    {
  850.     if(gl_findex == maxpat)
  851.         styleflag = 0;
  852.     else 
  853.         styleflag = 2;
  854.    }
  855.    else
  856.     styleflag = 3;            /* Else hatch   */
  857.  
  858.    gsx_moff();
  859.    vsf_interior(shandle,styleflag);
  860.    vsf_style(shandle,gl_findex);
  861.    pxyarray[0] = xpos;
  862.    pxyarray[1] = ypos;
  863.    pxyarray[2] = pxyarray[0] + ad_grattr[FBOX].ob_width - 1;
  864.    pxyarray[3] = pxyarray[1] + ad_grattr[FBOX].ob_height - 1;
  865.    v_bar(shandle,pxyarray);
  866.    gsx_mon();
  867. }
  868.  
  869.  
  870.  
  871.  
  872. /**************************************************************************/
  873. /* Function: draw_lbox()                          */
  874. /* Description: Draw line box in graphics dialog              */
  875. /**************************************************************************/
  876. draw_lbox(wider)
  877. int wider;
  878. {
  879.    int pxyarray[4];
  880.    int xpos,ypos;
  881.  
  882.    objc_offset(ad_grattr,LBOX,&xpos,&ypos);
  883.    pxyarray[0] = xpos;
  884.    pxyarray[1] = ypos;
  885.    pxyarray[2] = pxyarray[0] + ad_grattr[LBOX].ob_width - 1;
  886.    pxyarray[3] = pxyarray[1] + ad_grattr[LBOX].ob_height - 1;
  887.    gsx_moff();
  888.    if(!wider)
  889.    {
  890.       vsf_interior(shandle,0);
  891.       v_bar(shandle,pxyarray);
  892.    }
  893.    vsl_type(shandle,gl_lstyle);
  894.    vsl_width(shandle,1);
  895.    pxyarray[1] = pxyarray[3] = ypos + (ad_grattr[LBOX].ob_height/2);
  896.    v_pline(shandle,2,pxyarray);
  897.    gsx_mon();
  898. }
  899.  
  900.  
  901.  
  902.  
  903. /**************************************************************************/
  904. /* Function: do_grdialog()                          */
  905. /* Description: Handle graphics attribute dialog box              */
  906. /**************************************************************************/
  907. do_grdialog()
  908. {
  909.    int x,y,w,h;
  910.    int obj;
  911.    int cont;
  912.    int okflag;
  913.    int tmp_lstyle,tmp_lwidth;
  914.    int tmp_fstyle,tmp_findex;
  915.    int tmp_repel;
  916.    int tmp_repoffset;
  917.    int tmp_repbounds;
  918.    int tmpxy[4];
  919.    register int i;
  920.    int output_done;
  921.    register REGION *rptr;
  922.    int perimeter;
  923.    int patmode;
  924.    int oldrect[4];
  925.    int dummy;
  926.  
  927.   
  928.    vs_clip(shandle,0,tmpxy);
  929.  
  930.  
  931.    if(region_ptr)
  932.    {
  933.     if(region_ptr == gl_grregion_ptr)
  934.     {
  935.        gl_region_ptr = 0L;
  936.            get_grattr(gl_grregion_ptr,glgrattr);
  937.            gl_lstyle = glgrattr[0];
  938.            gl_lwidth = glgrattr[1];
  939.            gl_fstyle = glgrattr[2];
  940.            gl_findex = glgrattr[3];
  941.        gl_repel  = glgrattr[4];
  942.        gl_repbounds = glgrattr[6];
  943.        gl_repoffset = glgrattr[5];
  944.         }
  945.    }
  946.    tmp_lstyle = gl_lstyle;
  947.    tmp_lwidth = gl_lwidth;
  948.    tmp_fstyle = gl_fstyle;
  949.    tmp_findex = gl_findex;
  950.    tmp_repel = gl_repel;
  951.    tmp_repoffset = gl_repoffset;
  952.    tmp_repbounds = gl_repbounds;
  953.  
  954.    perimeter = gl_fstyle & 0x8000;
  955.    gl_fstyle &= 0x7fff;
  956.  
  957.    ad_grattr[FPATTERN].ob_state = NORMAL;
  958.    ad_grattr[FHATCH].ob_state = NORMAL;
  959.  
  960.    if(gl_fstyle == 2)
  961.    {
  962.     ad_grattr[FPATTERN].ob_state = SELECTED;
  963.     patmode = 1;
  964.    }
  965.    else
  966.    {
  967.     ad_grattr[FHATCH].ob_state = SELECTED;
  968.     patmode = 0;
  969.    }
  970.  
  971.    set_int(ad_grattr,GRBOFF,gl_repoffset);
  972.  
  973.    if(perimeter)
  974.    {
  975.     ad_grattr[PERIMON].ob_state = SELECTED;
  976.         ad_grattr[PERIMOFF].ob_state = NORMAL;
  977.    }
  978.    else
  979.    {
  980.     ad_grattr[PERIMON].ob_state = NORMAL;
  981.     ad_grattr[PERIMOFF].ob_state = SELECTED;
  982.    }
  983.  
  984.    if(gl_lwidth)
  985.    {
  986.     ad_grattr[GRPIXWID].ob_state = NORMAL;
  987.         ad_grattr[GRPTSWID].ob_state = SELECTED;
  988.     set_int(ad_grattr,GRLWID,gl_lwidth);
  989.    }
  990.    else
  991.    {
  992.     ad_grattr[GRPTSWID].ob_state = NORMAL;
  993.         ad_grattr[GRPIXWID].ob_state = SELECTED;
  994.     set_int(ad_grattr,GRLWID,0);
  995.    }
  996.  
  997.    for(i=GRTHRU;i<=GRAROUND;i++)
  998.         ad_grattr[i].ob_state = NORMAL;
  999.  
  1000.    ad_grattr[gl_repel + GRTHRU].ob_state = SELECTED;
  1001.  
  1002.    ad_grattr[RPLREG].ob_state = NORMAL;
  1003.    ad_grattr[RPLIMG].ob_state = NORMAL;
  1004.    ad_grattr[gl_repbounds + RPLREG].ob_state = SELECTED;
  1005.  
  1006.  
  1007.    form_center(ad_grattr,&x,&y,&w,&h);
  1008.    form_dial(0,0,0,36,36,x,y,w,h);
  1009.    objc_draw(ad_grattr,0,MAX_DEPTH,x,y,w,h);
  1010.    draw_fbox(patmode);
  1011.    draw_lbox(1);
  1012.    do
  1013.    {
  1014.      obj = form_do(ad_grattr,0);
  1015.        obj &= 0x7fff;
  1016.      cont = hndl_box(obj,&okflag);
  1017.    }while(cont);
  1018.    for(i = GRTHRU;i <= GRAROUND;i++)
  1019.    {
  1020.       if(ad_grattr[i].ob_state == SELECTED)
  1021.       {
  1022.     ad_grattr[i].ob_state = NORMAL;
  1023.     gl_repel = i - GRTHRU;
  1024.     break;
  1025.       }
  1026.    }
  1027.    if(ad_grattr[RPLREG].ob_state == SELECTED)
  1028.    {
  1029.     ad_grattr[RPLREG].ob_state = NORMAL;
  1030.     gl_repbounds = 0;
  1031.    }
  1032.    else
  1033.    {
  1034.     ad_grattr[RPLIMG].ob_state = NORMAL;
  1035.     gl_repbounds = 1;
  1036.    }
  1037.    gl_repoffset = get_int(ad_grattr,GRBOFF);
  1038.    if(ad_grattr[PERIMON].ob_state == SELECTED)
  1039.     perimeter = TRUE;
  1040.    else
  1041.     perimeter = FALSE;
  1042.    if(ad_grattr[GRPIXWID].ob_state == SELECTED)
  1043.     gl_lwidth = 0;
  1044.    else
  1045.     gl_lwidth = get_int(ad_grattr,GRLWID);
  1046.    if(!okflag)
  1047.    {
  1048.     gl_lstyle = tmp_lstyle;
  1049.         gl_lwidth = tmp_lwidth;
  1050.       gl_fstyle = tmp_fstyle;
  1051.     gl_findex = tmp_findex;
  1052.     gl_repel  = tmp_repel;
  1053.         gl_repbounds = tmp_repbounds;
  1054.        gl_repoffset = tmp_repoffset;
  1055.    }
  1056.  
  1057.    form_dial(3,0,0,36,36,x,y,w,h);
  1058.    check_top_window();
  1059.  
  1060.    if(okflag)
  1061.    {
  1062.         if(perimeter)
  1063.        gl_fstyle |= 0x8000;                /* perimeter set */
  1064.         if(multi_mode)
  1065.         {
  1066.        output_done = 1;
  1067.        rptr = curpage->regptr;
  1068.            while(rptr)
  1069.        {
  1070.           if(rptr->multi_select && rptr->type)
  1071.           {
  1072.                find_boundary(rptr,&oldrect[0],&oldrect[1],&oldrect[2],&oldrect[3],&dummy,&dummy);
  1073.                 redraw_spot(rptr,oldrect,0);    /* cjg - to clear out old rectangle */
  1074.                  glgrattr[0] = gl_lstyle;    /* Set up graphic attributes */
  1075.              glgrattr[1] = gl_lwidth;
  1076.              glgrattr[2] = gl_fstyle;
  1077.              glgrattr[3] = gl_findex;
  1078.          glgrattr[4] = gl_repel;
  1079.          glgrattr[5] = gl_repoffset;
  1080.              glgrattr[6] = gl_repbounds;
  1081.  
  1082.                  put_grattr(rptr,glgrattr);
  1083.              if((tmp_repel != gl_repel) || (tmp_repoffset != gl_repoffset)
  1084.                    || (tmp_repbounds != gl_repbounds))
  1085.              {
  1086.                 update_repel(0,0L);
  1087.                  }
  1088.          else
  1089.          {
  1090.               redr_regarea(rptr,1);
  1091.           }
  1092.           }
  1093.           rptr = rptr->plink;
  1094.         }    
  1095.     }
  1096.     else if(gl_grregion_ptr)     
  1097.         {
  1098.        find_boundary(gl_grregion_ptr,&oldrect[0],&oldrect[1],&oldrect[2],&oldrect[3],&dummy,&dummy);
  1099.            redraw_spot(gl_grregion_ptr,oldrect,0);  /* to clear out old rectangle */
  1100.            glgrattr[0] = gl_lstyle;          /* Set up graphic attributes */
  1101.            glgrattr[1] = gl_lwidth;
  1102.            glgrattr[2] = gl_fstyle;
  1103.            glgrattr[3] = gl_findex;
  1104.        glgrattr[4] = gl_repel;
  1105.        glgrattr[5] = gl_repoffset;
  1106.            glgrattr[6] = gl_repbounds;
  1107.  
  1108.            put_grattr(gl_grregion_ptr,glgrattr); /* and store in region  */
  1109.        if((tmp_repel != gl_repel) || (tmp_repoffset != gl_repoffset)
  1110.                    || (tmp_repbounds != gl_repbounds))
  1111.        {
  1112.           update_repel(0,0L);
  1113.           output_done = 1;
  1114.            }
  1115.        else
  1116.           output_done = 0;
  1117.     }
  1118.  
  1119.         if((graph_flag || gl_grregion_ptr)&&!output_done)
  1120.         {
  1121.            redr_regarea(gl_grregion_ptr,1);
  1122.         }
  1123.  
  1124.    }
  1125.    screen_clip();
  1126. }
  1127.  
  1128.  
  1129.  
  1130.  
  1131. /**************************************************************************/
  1132. /* Function: hndl_box()                              */
  1133. /* Descriptio: Handle box once object is found                  */
  1134. /**************************************************************************/
  1135. hndl_box(obj,okflag)
  1136. int obj;
  1137. int *okflag;
  1138. {
  1139.    int patmode;
  1140.    int cont;
  1141.    cont = 1;
  1142.    *okflag = 1;
  1143.  
  1144.    if(ad_grattr[FPATTERN].ob_state == SELECTED)
  1145.    {
  1146.     gl_fstyle = 2;
  1147.     patmode = 1;
  1148.    }
  1149.    else
  1150.    {
  1151.     gl_fstyle = 3; 
  1152.     patmode = 0;
  1153.    }
  1154.  
  1155.    switch(obj)
  1156.    {
  1157.     case FINDEXL:
  1158.         if(gl_findex > 1)
  1159.            gl_findex -= 1;
  1160.         else
  1161.         {
  1162.            if(patmode)
  1163.             gl_findex = maxpat;
  1164.            else
  1165.              gl_findex = maxhatch;
  1166.         
  1167.         }
  1168.         draw_fbox(patmode);
  1169.         break;
  1170.  
  1171.     case FINDEXR:
  1172.         if(patmode)
  1173.          {
  1174.            if(gl_findex >= maxpat)
  1175.             gl_findex = 1;
  1176.            else 
  1177.             gl_findex += 1;
  1178.         }
  1179.         else
  1180.         {
  1181.            if(gl_findex >= maxhatch)
  1182.             gl_findex = 1;
  1183.            else
  1184.             gl_findex += 1;
  1185.         }
  1186.         draw_fbox(patmode);
  1187.         break;
  1188.     case FPATTERN:
  1189.         gl_fstyle = 2;
  1190.         draw_fbox(1);
  1191.         break;
  1192.     case FHATCH:
  1193.         gl_fstyle = 3;
  1194.         if(gl_findex > maxhatch)
  1195.             gl_findex = maxhatch;
  1196.         draw_fbox(0);
  1197.         break;
  1198.     case LSTYLEL:
  1199.         if(gl_lstyle > 1)
  1200.             gl_lstyle -= 1;
  1201.         else
  1202.             gl_lstyle = maxlstyles;
  1203.         draw_lbox(1);
  1204.         break;
  1205.     case LSTYLER:
  1206.         if(gl_lstyle == maxlstyles)
  1207.             gl_lstyle = 1;
  1208.         else
  1209.             gl_lstyle += 1;
  1210.         draw_lbox(1);
  1211.         break;
  1212.     case GROK:
  1213.         ad_grattr[GROK].ob_state = NORMAL;
  1214.         cont = 0;
  1215.         break;
  1216.     case GRCANCEL:
  1217.         ad_grattr[GRCANCEL].ob_state = NORMAL;
  1218.         *okflag = 0;
  1219.         cont = 0;
  1220.         break;
  1221.     }
  1222.     return cont;
  1223. }
  1224.  
  1225.  
  1226.         
  1227.  
  1228.  
  1229. /**************************************************************************/
  1230. /* Function:    do_point_size()                          */
  1231. /* Description: Set Current Point Size                      */
  1232. /**************************************************************************/
  1233. do_point_size()
  1234. {
  1235.      int button;
  1236.      int tmplnsp;
  1237.      long *str1;
  1238.      long str2;
  1239.      int x,y,w,h;
  1240.      int x1,y1;
  1241.      int fnt;
  1242.      int pxy[4];
  1243.      register int findex;
  1244.      int *fntptr;
  1245.      int found;
  1246.      int sobj;
  1247.      int jtype;
  1248.      int lowend = 0;
  1249.  
  1250.      clr_attr_flag();
  1251.  
  1252.      if(region_ptr)
  1253.      {
  1254.     if(gl_region_ptr == region_ptr)
  1255.     {
  1256.       gl_grregion_ptr = 0L;
  1257.       get_txtattr(gl_region_ptr,&gltxtattr);
  1258.       update_point_dialog();
  1259.     }
  1260.      }
  1261.  
  1262.      fnt = gltxtattr.font;
  1263.      findex = found = 0;
  1264.      for(findex = 0; findex < 16;findex++)
  1265.      {
  1266.     fntptr = ftlib + (findex*SFTSIZ);
  1267.     if(fnt == *fntptr)
  1268.     {
  1269.        found = 1;
  1270.        break;
  1271.     }
  1272.      }
  1273.      str1 = ad_point_size[FNTNME].ob_spec;
  1274.      if(!found)
  1275.      {
  1276.     lowend = findex = -1;
  1277.     str2 = " ";
  1278.     
  1279.      }
  1280.      else    
  1281.         str2 = ftlib + ((findex * SFTSIZ)+TFNOFS); 
  1282.      strcpy(*str1,str2);
  1283.  
  1284.      update_point_dialog();
  1285.     
  1286.      ad_point_size[FKERNON].ob_state = NORMAL;
  1287.      ad_point_size[FKERNOFF].ob_state = NORMAL;
  1288.      ad_point_size[FREVON].ob_state = NORMAL;
  1289.      ad_point_size[FREVOFF].ob_state = NORMAL;
  1290.  
  1291.      if(gltxtattr.kernmd)
  1292.     ad_point_size[FKERNON].ob_state = SELECTED;
  1293.      else
  1294.     ad_point_size[FKERNOFF].ob_state = SELECTED;
  1295.  
  1296.      if(gltxtattr.rvomd)
  1297.     ad_point_size[FREVON].ob_state = SELECTED;
  1298.      else
  1299.     ad_point_size[FREVOFF].ob_state = SELECTED;
  1300.  
  1301.      form_center(ad_point_size,&x,&y,&w,&h);
  1302.      form_dial(0,0,0,36,36,x,y,w,h);
  1303.      objc_draw(ad_point_size,0,MAX_DEPTH,x,y,w,h);
  1304.  
  1305.      objc_offset(ad_point_size,FNTNME,&x1,&y1);
  1306.      pxy[0] = x1;
  1307.      pxy[1] = y1;
  1308.      pxy[2] = x1 + ad_point_size[FNTNME].ob_width - 1;
  1309.      pxy[3] = y1 + ad_point_size[FNTNME].ob_height - 1;
  1310.      vsf_interior(shandle,0);
  1311.  
  1312.      sobj = FONTNUM;
  1313. err: do
  1314.      {
  1315.     button = form_do(ad_point_size,sobj);
  1316.      button &= 0x7fff;
  1317.         if((button == FNTFWD) || (button == FNTBAK))
  1318.     {
  1319.        if(button == FNTFWD)
  1320.           findex += 1;
  1321.        else
  1322.           findex -= 1;
  1323.  
  1324.        if(findex < lowend)            /* either 0 or -1 */
  1325.           findex = 15;
  1326.  
  1327.        if(findex > 15)
  1328.           findex = lowend;            /* either 0 or -1 */
  1329.        if( findex == -1 )
  1330.          str2 = " ";    
  1331.        else
  1332.               str2 = ftlib + ((findex * SFTSIZ)+TFNOFS); 
  1333.             strcpy(*str1,str2);       
  1334.        v_bar(shandle,pxy);
  1335.        objc_draw(ad_point_size,FNTNME,1,x,y,w,h);
  1336.        fntptr = ftlib + (findex*SFTSIZ);
  1337.        if(findex == -1 )
  1338.          set_int(ad_point_size,FONTNUM,fnt);
  1339.        else
  1340.          set_int(ad_point_size,FONTNUM,*fntptr);       
  1341.        objc_draw(ad_point_size,FONTNUM,1,x,y,w,h);        
  1342.     }
  1343.      } while((button != FOK) && (button != FCANCEL));
  1344.  
  1345.  
  1346.      ad_point_size[button].ob_state = NORMAL;
  1347.      if(button == FOK)
  1348.      {
  1349.         tmplnsp = (int)gltxtattr.lnsp;
  1350.     attr_flag[2] = 1;
  1351.         do_font_info(ad_point_size,FONTNUM,999,1,&gltxtattr.font);
  1352.         attr_flag[5] = 1;
  1353.  
  1354.     if(!parmcheck(ad_point_size,FNTSIZE,2,0))
  1355.     {
  1356.             gltxtattr.ptsz = Pval;
  1357.             attr_flag[3] = 1;
  1358.     }
  1359.         else
  1360.         {
  1361.      sobj = FNTSIZE;
  1362.          objc_draw(ad_point_size,button,1,x,y,w,h);
  1363.          goto err;
  1364.         }
  1365.     
  1366.         if(!parmcheck(ad_point_size,SSETSIZE,2,0))
  1367.         {
  1368.             gltxtattr.ssiz = Pval;
  1369.             attr_flag[4] = 1;            
  1370.     }
  1371.     else
  1372.     {
  1373.      sobj = SSETSIZE;
  1374.          objc_draw(ad_point_size,button,1,x,y,w,h);
  1375.      goto err;
  1376.     }
  1377.  
  1378.  
  1379.         jtype = unit_type;
  1380.     unit_type = 1;    /* points */
  1381.     if(!parmcheck(ad_point_size,LINESPCE,4,0)) /* used to be a 4 */
  1382.     {
  1383.                 unit_type = jtype;
  1384.             gltxtattr.lnsp = (long)Pval;
  1385.             attr_flag[2] = 1;
  1386.      }
  1387.         else
  1388.     {
  1389.       unit_type = jtype;
  1390.       sobj = LINESPCE;
  1391.           objc_draw(ad_point_size,button,1,x,y,w,h);
  1392.       goto err;
  1393.     }
  1394.  
  1395.  
  1396.  
  1397.         if(ad_point_size[FKERNON].ob_state == SELECTED)
  1398.         {
  1399.        gltxtattr.kernmd = 1;
  1400.        ad_point_size[FKERNON].ob_state = NORMAL;
  1401.         }
  1402.     else
  1403.     {
  1404.        gltxtattr.kernmd = 0;
  1405.        ad_point_size[FKERNOFF].ob_state = NORMAL;
  1406.     }
  1407.     attr_flag[8] = 1;
  1408.  
  1409.         if(ad_point_size[FREVON].ob_state == SELECTED)
  1410.         {
  1411.        gltxtattr.rvomd = 1;
  1412.        ad_point_size[FREVON].ob_state = NORMAL;
  1413.         }
  1414.     else
  1415.     {
  1416.        gltxtattr.rvomd = 0;
  1417.        ad_point_size[FREVOFF].ob_state = NORMAL;
  1418.     }
  1419.         attr_flag[19] = 1;
  1420.      }
  1421.      update_point_dialog();
  1422.      form_dial(3,0,0,3,36,x,y,w,h);
  1423.      zdevice = SCANNER;
  1424.      SH = vmupix((int)gltxtattr.lnsp);
  1425.      
  1426.      if(button == FOK)
  1427.      {
  1428.      upd_txt_attributes();
  1429.      }
  1430.  
  1431. }
  1432.  
  1433.  
  1434.  
  1435. /************************************************************************/
  1436. /* Function: upd_txt_attributes()                    */
  1437. /* Description: Stuff global attributes into the proper regions(s)      */
  1438. /************************************************************************/
  1439. upd_txt_attributes()
  1440. {
  1441.   register REGION *rptr;
  1442.   int found;     
  1443.   long art;
  1444.   struct txtattr locattr;
  1445.  
  1446.    if(multi_mode)
  1447.    {
  1448.            f_move(&gltxtattr.llen,&locattr.llen,sizeof(struct txtattr));
  1449.        rptr = curpage->regptr;
  1450.        while(rptr)
  1451.        {
  1452.           get_txtattr(rptr,&tmpattr);
  1453.  
  1454.           if(rptr->multi_select && !rptr->type)
  1455.           {
  1456.                    f_move(&locattr.llen,&gltxtattr.llen,sizeof(struct txtattr));
  1457.            copy_attr(&tmpattr);
  1458.            put_txtattr(rptr,&tmpattr);
  1459.             art = get_regart(rptr);
  1460.            if(art)
  1461.            {
  1462.             open_article(art);
  1463.             do_artcleanup(rptr,0);
  1464.            }
  1465.           }
  1466.           rptr = rptr->plink;
  1467.        }
  1468.        force_preview();
  1469.    }
  1470.    else if(gl_region_ptr)
  1471.    {
  1472.       put_txtattr(gl_region_ptr,&gltxtattr);
  1473.       page_redraw(gl_region_ptr);
  1474.    }
  1475. }
  1476.  
  1477.  
  1478.  
  1479. /**************************************************************************/
  1480. /* Function: do_scoffset()                          */
  1481. /* Description: Dialog to handle scan offset                  */
  1482. /**************************************************************************/
  1483. do_scoffset()
  1484. {
  1485.      int button;
  1486.      int x,y,w,h;
  1487.      int jtype;
  1488.  
  1489.      clr_attr_flag();
  1490.  
  1491.      jtype = unit_type;
  1492.      unit_type = 1;
  1493.      to_mu_vlrv(ad_scanoff,gltxtattr.scoff,SSCANVAL);
  1494.      unit_type = jtype;
  1495.  
  1496.      form_center(ad_scanoff,&x,&y,&w,&h);
  1497.      form_dial(0,0,0,36,36,x,y,w,h);
  1498.      objc_draw(ad_scanoff,0,MAX_DEPTH,x,y,w,h);
  1499.      
  1500. err:
  1501.      button = form_do(ad_scanoff,SSCANVAL);
  1502.      ad_scanoff[button].ob_state = NORMAL;
  1503.      if(button == SCANOK)
  1504.      {
  1505.      jtype = unit_type;
  1506.      unit_type = 1;
  1507.      if(!parmcheck(ad_scanoff,SSCANVAL,4,0)) /* used to be a 4 */
  1508.      {
  1509.         unit_type = jtype;
  1510.         gltxtattr.scoff = Pval;
  1511.         attr_flag[22] = 1;
  1512.         upd_txt_attributes();
  1513.      }
  1514.      else
  1515.      {
  1516.         unit_type = jtype;
  1517.         objc_draw(ad_scanoff,button,1,x,y,w,h);
  1518.         goto err;
  1519.      }
  1520.      }
  1521.      form_dial(3,0,0,3,36,x,y,w,h);
  1522. }
  1523.  
  1524.  
  1525.  
  1526.  
  1527.  
  1528. /**************************************************************************/
  1529. /* Function:    do_go_page()                          */
  1530. /* Description: Set Current Page Number                      */
  1531. /**************************************************************************/
  1532. do_go_page()
  1533. {
  1534.      int button;
  1535.      int tmp_setting;
  1536.      int prev_page;
  1537.  
  1538.      prev_page = tmp_setting = curr_page;
  1539.  
  1540.      set_int(ad_go_page,GOTOPAGE,curr_page);     
  1541.      button = execform(ad_go_page,GOTOPAGE);
  1542.      ad_go_page[button].ob_state = NORMAL;
  1543.      if(button == GOOK)
  1544.      {
  1545.      tmp_setting = get_int(ad_go_page,GOTOPAGE);
  1546.      if(tmp_setting > 999)
  1547.           curr_page = 999;
  1548.          else
  1549.          curr_page = ((tmp_setting < 0) ? (0):(tmp_setting));
  1550.      }
  1551.      set_int(ad_go_page,GOTOPAGE,curr_page);
  1552.  
  1553.      if(prev_page != curr_page)
  1554.      {
  1555.         mode_change = TRUE;
  1556.         force_preview();
  1557.      }
  1558.      do_pagenum(curr_page,(curr_page%2)?1:0);
  1559. }
  1560.  
  1561.  
  1562.  
  1563.  
  1564. /**************************************************************************/
  1565. /* Function:    do_font_info()                          */
  1566. /* Description: Get info from dialog boxes                  */
  1567. /**************************************************************************/
  1568. do_font_info(tree,index,fmax,fmin,value)
  1569. OBJECT *tree;
  1570. int index;
  1571. int fmax;
  1572. int fmin;
  1573. int *value;
  1574. {
  1575.     int tmp_setting;
  1576.  
  1577.     tmp_setting = get_int(tree,index);
  1578.     if(tmp_setting > fmax)
  1579.         *value = fmin;
  1580.     else
  1581.         *value = ((tmp_setting < fmin) ? (fmin): (tmp_setting));
  1582. }
  1583.  
  1584.  
  1585.  
  1586.  
  1587. /**************************************************************************/
  1588. /* Function:    get_image()                          */
  1589. /* Description:    Setup to load images dialog                  */
  1590. /**************************************************************************/
  1591. get_image()
  1592. {
  1593.     int button;
  1594.     register int i;
  1595.     int changed;
  1596.  
  1597.     button = execform(ad_get_image,0);
  1598.     ad_get_image[button].ob_state = NORMAL;
  1599.     for(i=INEO;i<=IPI1;i++)
  1600.     {
  1601.        if(ad_get_image[i].ob_state == SELECTED)
  1602.        {
  1603.       cur_pic_type = i - INEO;
  1604.           break;
  1605.        }
  1606.     }
  1607.     strcpy(pathbuf,dpath3);
  1608.     switch(cur_pic_type)
  1609.     {
  1610.        case 0:  strcat(pathbuf,"*.NEO");
  1611.         
  1612.         break;
  1613.  
  1614.        case 1:  strcat(pathbuf,"*.IMG");
  1615.         break;
  1616.  
  1617.        case 2:  strcat(pathbuf,"*.GEM");
  1618.         break;
  1619.  
  1620.        case 3:  strcat(pathbuf,"*.PI1");
  1621.         break;
  1622.     }
  1623.     if(!get_fs(fbuffer,&changed))
  1624.     {
  1625.                funcs = &nada;
  1626.            graf_mouse(ARROW,&dummy);
  1627.            return(0);
  1628.     }
  1629.  
  1630.     if(changed)                    /* If path changed */
  1631.     {
  1632.     alert_cntre(ALERT38);
  1633.     funcs = &nada;
  1634.     graf_mouse(ARROW,&dummy);
  1635.     return(0);
  1636.     }
  1637.  
  1638.     extender(fbuffer,gtype[cur_pic_type]);
  1639.     Fsetdta(&thedta.res[0]);
  1640.     if(Fsfirst(fbuffer,0) <= -1)
  1641.     {
  1642.         funcs = &nada;
  1643.         graf_mouse(ARROW,&dummy);
  1644.         alert_cntre(ALERT8);        
  1645.         return(0);
  1646.     }
  1647.     return(1);
  1648.           
  1649. }
  1650.  
  1651.  
  1652.  
  1653.  
  1654. /**************************************************************************/
  1655. /* Function:    update_point_dialog()                      */
  1656. /* Description:    Setup Font info                          */
  1657. /**************************************************************************/
  1658. update_point_dialog()
  1659. {
  1660.      int jtype;
  1661.  
  1662.      set_int(ad_point_size,FONTNUM,gltxtattr.font);
  1663.      to_mu_pt12(ad_point_size,gltxtattr.ssiz,SSETSIZE);
  1664.      to_mu_pt12(ad_point_size,gltxtattr.ptsz,FNTSIZE);
  1665.  
  1666.      jtype = unit_type;
  1667.      unit_type = 1;    /* points */     
  1668.      to_mu_vlrv(ad_point_size,(int)gltxtattr.lnsp,LINESPCE);
  1669.      unit_type = jtype;
  1670. }
  1671.  
  1672.  
  1673.  
  1674.  
  1675. /**************************************************************************/
  1676. /* Function: init_artobj()                          */
  1677. /* Description:    Initialize Article selector box                  */
  1678. /**************************************************************************/
  1679. init_artobj()
  1680. {
  1681.    int tot;
  1682.  
  1683.    tot = get_num_arts();
  1684.    init_slider(artobj,tot,DSLDER,DSLDBOX,&hslider,PAGESIZ);
  1685.    curfirst_art = 0;            /* Start with first article */
  1686.    set_artobj(curfirst_art);
  1687. }
  1688.  
  1689.  
  1690.  
  1691.  
  1692.  
  1693. /**************************************************************************/
  1694. /* Function: deselect()                              */
  1695. /* Description: Deselect all objects of the Article tree          */
  1696. /**************************************************************************/
  1697. deselect()
  1698. {
  1699.    register int i;
  1700.  
  1701.    for(i = DART1;i <= DART8;i++)
  1702.    {
  1703.     if(artobj[i].ob_state == SELECTED)
  1704.     {
  1705.        objc_change(artobj,i,0,aworkx,aworky,aworkw,aworkh,
  1706.         NORMAL,1);
  1707.     }
  1708.    }
  1709. }
  1710.  
  1711.  
  1712.  
  1713.  
  1714. /**************************************************************************/
  1715. /* Function: init_slider()                          */
  1716. /* Description: Initialize the slider size in the Article box          */
  1717. /**************************************************************************/
  1718. init_slider(obj,tot_names,slider,sld_box,height,max)
  1719. OBJECT *obj;
  1720. int    tot_names,slider,sld_box;
  1721. int    *height;
  1722. int     max;
  1723. {
  1724.     register OBJECT    *sldobj;
  1725.     register OBJECT    *sldbxobj;
  1726.  
  1727.     sldobj = &obj[slider];        /* init slider object */
  1728.     sldbxobj = &obj[sld_box];    /* init slider object */
  1729.  
  1730.     sldobj->ob_y = 0;        /* init slider -top position */
  1731.                     /* set slider box size */
  1732.     if(tot_names <= max)
  1733.         sldobj->ob_height=sldbxobj->ob_height;
  1734.     else
  1735.         sldobj->ob_height=(sldbxobj->ob_height*max)/tot_names;
  1736.     *height = sldbxobj->ob_height - sldobj->ob_height;
  1737. }
  1738.  
  1739.  
  1740.  
  1741. /************************************************************************/
  1742. /* Function: get_num_arts()                        */
  1743. /* Description: Return number of articles in memory            */
  1744. /************************************************************************/
  1745. get_num_arts()
  1746. {
  1747.    register int count;
  1748.  
  1749.    if(!getf_article())
  1750.     return(0);
  1751.    count = 1;
  1752.    while(getn_article())
  1753.     count++;
  1754.    return(count);
  1755. }
  1756.  
  1757.  
  1758.  
  1759.  
  1760. /************************************************************************/
  1761. /* do_slider    Move the slider in the slider box to the correct    */
  1762. /*        position.                        */
  1763. /************************************************************************/
  1764. do_slider(obj,slider,sld_box,sld_height,tot_names,cur_name,max)
  1765. OBJECT    *obj;
  1766. int    slider;
  1767. int    sld_box;
  1768. register int    sld_height;
  1769. int    tot_names;
  1770. int    cur_name;
  1771. int     max;
  1772. {
  1773.    int    y;
  1774.    register OBJECT    *sldobj;
  1775.  
  1776.    sldobj = &obj[slider];               /* init slider object      */
  1777.    y = sldobj->ob_y;                      /* get current y position  */
  1778.    sldobj->ob_y =  (sld_height*cur_name)/(tot_names-max);
  1779.    if(sldobj->ob_y > sld_height)              /* keep in parent box      */
  1780.        sldobj->ob_y = sld_height;
  1781.    if(sldobj->ob_y != y)              /* If (different position) */
  1782.     objc_draw(obj,sld_box,1,aworkx,aworky,aworkw,aworkh);     /* draw it */
  1783. }
  1784.  
  1785.  
  1786.  
  1787. /**************************************************************************/
  1788. /* Function do_artobj()                              */
  1789. /* Description:                               */
  1790. /**************************************************************************/
  1791. long do_artobj()
  1792. {
  1793.    int x,y,w,h;
  1794.    register int obj;
  1795.    int cont;
  1796.    int okflag;
  1797.    int tmpxy[4];
  1798.    register long artptr;
  1799.    register int i;
  1800.    int found;
  1801.    char *str;
  1802.  
  1803.    vs_clip(shandle,0,tmpxy);
  1804.    init_artobj();
  1805.    form_center(artobj,&x,&y,&w,&h);
  1806.    form_dial(0,0,0,36,36,x,y,w,h);
  1807.    objc_draw(artobj,0,MAX_DEPTH,x,y,w,h);
  1808.  
  1809.    do
  1810.    {
  1811.      obj = form_do(artobj,0);
  1812.        obj &= 0x7fff;
  1813.      cont = hndl_abox(obj,&okflag);
  1814.    }while(cont);
  1815.    if(okflag)
  1816.    {
  1817.       artobj[DOK].ob_state = NORMAL;
  1818.       found = 0;
  1819.       for(i = DART1;i <= DART8;i++)
  1820.       {
  1821.      if(artobj[i].ob_state == SELECTED)
  1822.      {
  1823.         artobj[i].ob_state = NORMAL;
  1824.         found = 1;
  1825.         break;
  1826.      }
  1827.       }
  1828.       if(found)
  1829.       {
  1830.          artptr = getf_article();
  1831.      while(artptr)
  1832.      {
  1833.         str = get_artfname();
  1834.  
  1835.         if(!strcmp(str,artobj[i].ob_spec))
  1836.         break;
  1837.         artptr = getn_article();
  1838.      }
  1839.       }
  1840.       else        /* If not found */
  1841.     artptr = 0L;
  1842.    }
  1843.    else            /* If cancel selected */
  1844.    {
  1845.     artobj[DCANCEL].ob_state = NORMAL;
  1846.     artptr = 0L; 
  1847.    }
  1848.    form_dial(3,0,0,36,36,x,y,w,h);
  1849.    screen_clip();
  1850.    return artptr;
  1851. }
  1852.  
  1853.  
  1854.  
  1855.  
  1856. /************************************************************************/
  1857. /* get_artptr    Handle the article box                    */
  1858. /************************************************************************/
  1859. hndl_abox(obj,okflag)
  1860. int    obj;
  1861. int     *okflag;
  1862. {
  1863. int    mov_dir;
  1864. int    x_box,y_box;
  1865. int    value;
  1866. int    num;
  1867. register OBJECT    *slider;
  1868. register OBJECT    *slidbox;
  1869. int     cont;
  1870. int     mx,my;
  1871. int    dummy;
  1872.  
  1873.    *okflag = 1;
  1874.    cont = 1;
  1875.    num = get_num_arts();
  1876.    slider = &artobj[DSLDER];
  1877.    slidbox = &artobj[DSLDBOX];
  1878.    switch(obj)
  1879.    {
  1880.     case    DDOWN:
  1881.        if(slider->ob_y == slidbox->ob_height-hslider) 
  1882.         break;
  1883.        hndl_list(curfirst_art,1);
  1884.        break;
  1885.     case    DUP:
  1886.        if(!slider->ob_y) 
  1887.         break;
  1888.        hndl_list(curfirst_art,-1);
  1889.        break;
  1890.     case    DSLDBOX:
  1891.        graf_mkstate(&mx,&my,&dummy,&dummy);
  1892.        objc_offset(artobj,DSLDBOX,&x_box,&y_box);
  1893.        if(my > y_box+slider->ob_y) 
  1894.         mov_dir = PAGESIZ;
  1895.        else    
  1896.         mov_dir = -PAGESIZ;
  1897.        hndl_list(curfirst_art,mov_dir);
  1898.        break;
  1899.     case    DSLDER:
  1900.        value = graf_slidebox(artobj,DSLDBOX,DSLDER);
  1901.        value = scaler(value,num-PAGESIZ,1000);
  1902.        hndl_list(value,0);
  1903.        break;
  1904.     case    DART1:
  1905.     case    DART2:
  1906.     case    DART3:
  1907.     case    DART4:
  1908.     case    DART5:
  1909.     case    DART6:
  1910.     case    DART7:
  1911.     case    DART8:
  1912.            break;
  1913.     case    DOK:
  1914.        cont = 0;
  1915.        *okflag = 1;
  1916.        break;
  1917.     case     DCANCEL:
  1918.        cont = 0;
  1919.        *okflag = 0;
  1920.     default:
  1921.            break;
  1922.    } /* end switch */
  1923.  
  1924.    return(cont);
  1925. }
  1926.  
  1927.  
  1928.  
  1929.  
  1930.  
  1931. /************************************************************************/
  1932. /* hndl_list    Routine to handle the font selection list.        */
  1933. /************************************************************************/
  1934. hndl_list(begname,movdir)
  1935. int    begname;
  1936. int    movdir;
  1937. {
  1938.    int    tot;
  1939.  
  1940.    tot =  get_num_arts();
  1941.    gsx_moff();            /* remove the rat */
  1942.    deselect();            /* deselect names */
  1943.    curfirst_art = scroll(tot,begname,movdir);
  1944.    do_slider(artobj,DSLDER,DSLDBOX,hslider,tot,curfirst_art,PAGESIZ);
  1945.    gsx_mon();    
  1946. }
  1947.  
  1948.  
  1949.  
  1950.  
  1951. /************************************************************************/
  1952. /* scroll    Given a pointer to a device block the starting font in  */
  1953. /* the font list, and the amt to scroll(1,-1,PAGESIZ,-PAGESIZ). Returns */
  1954. /* the object number of the top displayed object.                */
  1955. /************************************************************************/
  1956. scroll(total_names,startname,amount)
  1957. int    total_names;
  1958. int    startname;        /* starting font in linked list */
  1959. int    amount;            /* amount to move by */
  1960. {
  1961.    register int    i,j;
  1962.    int    textobj,x,y;
  1963.    long scrmfdb;
  1964.  
  1965.    scrmfdb = 0L;
  1966.  
  1967.    i = startname+amount;
  1968.    j = total_names-PAGESIZ;
  1969.  
  1970.    if(i<0 || j<0) 
  1971.     i = 0;
  1972.    if(j<0) 
  1973.     j=0;
  1974.    if(i>j) 
  1975.         i = j;
  1976.  
  1977.  
  1978.    set_artobj(i);
  1979.  
  1980.    if(amount != -1 && amount != 1) 
  1981.    {                     /* do page scrolling (objc_draw) */
  1982.     objc_draw(artobj,DARTROOT,1,aworkx,aworky,aworkw,aworkh);
  1983.     return(i);
  1984.    }
  1985.    if(i==startname)
  1986.      return(i);            /* reject unnecessary single scroll */
  1987.  
  1988.                     /* else we do single line scroll */
  1989.  
  1990.    objc_offset(artobj,DART1,&x,&y);
  1991.  
  1992.    ptsin[0] = x;                /* init clipping x,y,w,h */
  1993.    ptsin[1] = y;
  1994.    ptsin[2] = x+artobj[DART1].ob_width;
  1995.    ptsin[3] = y+gl_hchar*PAGESIZ-1;
  1996.  
  1997.    ptsin[4] = x;                /* init blit destination */
  1998.    ptsin[5] = y;
  1999.    ptsin[6] = ptsin[2];
  2000.    ptsin[7] = ptsin[3];
  2001.  
  2002.    vs_clip(shandle,1,ptsin);
  2003.  
  2004.    if(amount < 0) 
  2005.    {                        /* if (-) going up */
  2006.     ptsin[1] -= gl_hchar;        /* src y */
  2007.     ptsin[3] += gl_hchar;        /* src h */
  2008.     ptsin[7] += gl_hchar;
  2009.     textobj = artobj[DARTROOT].ob_head;
  2010.    }
  2011.    else 
  2012.    {                        /* going down */
  2013.     ptsin[3] += gl_hchar;
  2014.     ptsin[5] -= gl_hchar;
  2015.     ptsin[7] -= gl_hchar;
  2016.     textobj = artobj[DARTROOT].ob_tail;
  2017.    }
  2018.    gsx_moff();
  2019.    vro_cpyfm(shandle,3,ptsin,&scrmfdb,&scrmfdb);
  2020.    objc_draw(artobj,textobj,0,aworkx,aworky,aworkw,aworkh);
  2021.    gsx_mon();
  2022.    return(i);
  2023. }
  2024.  
  2025.  
  2026.  
  2027.  
  2028. /************************************************************************/
  2029. /* set_artobj    Set the objects string pointers in the artobj to the    */
  2030. /*        article names found in article linked list. Starting    */
  2031. /*        at the curr_index articles and continuing until        */
  2032. /*        PAGESIZ are done or no more.                  */
  2033. /************************************************************************/
  2034. set_artobj(nameindex)
  2035. register int    nameindex;
  2036. {
  2037.    int    flag;
  2038.    register OBJECT *curobj;
  2039.    register int i;
  2040.    int obj;
  2041.    register long artnames;
  2042.    char *fname;
  2043.  
  2044.    flag = SELECTABLE|RBUTTON;            /* if displayed fonts */
  2045.                         /* get to current index */
  2046.    artnames = getf_article();
  2047.    if(artnames)
  2048.    {
  2049.     while(nameindex-- && artnames)
  2050.        artnames = getn_article();
  2051.    }
  2052.    i  = PAGESIZ-1;
  2053.    obj = DART1;
  2054.    do 
  2055.    {
  2056.     curobj = &artobj[obj];              /* current GSTRING   */
  2057.     if(!artnames) 
  2058.     {                      /* if no font        */
  2059.        curobj->ob_spec = tmpflname;       /* use template      */
  2060.            curobj->ob_flags = NONE;
  2061.     }
  2062.     else 
  2063.     {
  2064.        fname = get_artfname();
  2065.        curobj->ob_spec = fname;               /* or filename       */
  2066.        curobj->ob_flags = flag;           /* set proper flags  */
  2067.        artnames = getn_article();
  2068.     }
  2069.     obj = curobj->ob_next;                 /* next object index */
  2070.  
  2071.    } while(i--);
  2072. }
  2073.  
  2074.  
  2075.  
  2076.  
  2077.  
  2078. /**************************************************************************/
  2079. /* Function: do_unit_dialog()                          */
  2080. /* Description: handle changing units of measure              */
  2081. /**************************************************************************/
  2082. do_unit_dialog()
  2083. {
  2084.    int button;
  2085.    register int i;
  2086.    register int *hval,*vval;
  2087.    int titem;
  2088.  
  2089.    unitobj[MINCHES+unit_type].ob_state = SELECTED;
  2090.    button = execform(unitobj,0);
  2091.    unitobj[button].ob_state = NORMAL;
  2092.    if(button == MOK)
  2093.    {
  2094.     for(i = MINCHES;i <= MCICERO;i++)
  2095.     {
  2096.        if(unitobj[i].ob_state == SELECTED)
  2097.        {
  2098.         unitobj[i].ob_state = NORMAL;
  2099.         unit_type = i - MINCHES;
  2100.        }
  2101.         }
  2102.  
  2103.            switch(unit_type)
  2104.            {
  2105.                 case 0:   hval = hinch_mus;
  2106.             vval = vinch_mus; 
  2107.              break;
  2108.  
  2109.                 case 1:    hval = hpica_mus;
  2110.             vval = vpica_mus;
  2111.             break;
  2112.  
  2113.           case 2:    hval = hcent_mus;
  2114.             vval = vcent_mus;
  2115.             break;
  2116.  
  2117.                 case 3:    hval = hcicero_mus;
  2118.             vval = vcicero_mus;
  2119.             break;
  2120.            }
  2121.  
  2122.  
  2123.         for(i = GRBUT1;i <= GRBUT4;i++)
  2124.             {
  2125.            if(gridspace[i].ob_state == SELECTED)
  2126.            {
  2127.          hgridspace = hval[i - GRBUT1];
  2128.          vgridspace = vval[i - GRBUT1];
  2129.            }
  2130.         }
  2131.             if(view_size != PADJCNT)
  2132.         titem = view_size;
  2133.               else
  2134.                 titem = ((curr_page % 2)?(view_size + 1):(view_size));        
  2135.               wind_set(prev_handle,WF_INFO,winfo[titem - PSIZE][unit_type]);
  2136.         return(1);    
  2137.    }
  2138.    else
  2139.    {
  2140.     for(i=MINCHES;i<=MCICERO;i++)
  2141.         unitobj[i].ob_state = NORMAL;
  2142.     unitobj[MINCHES+unit_type].ob_state = SELECTED;
  2143.     return(0);
  2144.    }
  2145. }
  2146.  
  2147.  
  2148.  
  2149.  
  2150.  
  2151. /**************************************************************************/
  2152. /* Function: do_grid_space()                          */
  2153. /* Description: select grid spacing dialog                  */
  2154. /**************************************************************************/
  2155. do_grid_space()
  2156. {
  2157.    int button;
  2158.    register int i;
  2159.    int oldsp;
  2160.    register char **str;
  2161.    register int *hval;
  2162.    register int *vval;
  2163.    
  2164.    switch(unit_type)
  2165.    {
  2166.       case 0:   str = grid_inch;
  2167.         hval = hinch_mus;
  2168.         vval = vinch_mus; 
  2169.          break;
  2170.       case 1:   str = grid_picas;
  2171.         hval = hpica_mus;
  2172.         vval = vpica_mus;
  2173.         break;
  2174.       case 2:   str = grid_cents;
  2175.         hval = hcent_mus;
  2176.         vval = vcent_mus;
  2177.         break;
  2178.       case 3:   str = grid_cicero;
  2179.         hval = hcicero_mus;
  2180.         vval = vcicero_mus;
  2181.    }
  2182.    for(i = GRBUT1;i <= GRBUT4;i++)
  2183.    {
  2184.       gridspace[i].ob_spec = str[i - GRBUT1];
  2185.       if(gridspace[i].ob_state == SELECTED)
  2186.       {
  2187.     oldsp = i;
  2188.       }
  2189.    }
  2190.    button = execform(gridspace,0);
  2191.    if(button == GRIDOK)
  2192.    {
  2193.     gridspace[GRIDOK].ob_state = NORMAL;
  2194.     for(i = GRBUT1;i <= GRBUT4;i++)
  2195.         {
  2196.        if(gridspace[i].ob_state == SELECTED)
  2197.        {
  2198.         hgridspace = hval[i - GRBUT1];
  2199.         vgridspace = vval[i - GRBUT1];
  2200.        }
  2201.     }
  2202.     return(1);
  2203.    }
  2204.    else
  2205.    {
  2206.     for(i = GRBUT1;i <= GRBUT4;i++)
  2207.         {
  2208.        gridspace[i].ob_state = NORMAL;
  2209.     }
  2210.         gridspace[oldsp].ob_state = SELECTED;
  2211.     gridspace[GRIDCAN].ob_state = NORMAL;
  2212.     return(0);
  2213.    }
  2214.    
  2215. }
  2216.     
  2217.  
  2218.  
  2219.  
  2220.  
  2221. /**************************************************************************/
  2222. /* Function: do_page_def()                          */
  2223. /* Description: Page Type Selection Dialog                  */
  2224. /**************************************************************************/
  2225. do_page_def()
  2226. {
  2227.    int button;
  2228.    register int i;
  2229.    int pagetmp;
  2230.  
  2231.    for(i=PA4;i<=PLEGAL;i++)
  2232.     adpagedef[i].ob_state = NORMAL;
  2233.    adpagedef[PPORT].ob_state = NORMAL;
  2234.    adpagedef[PLAND].ob_state = NORMAL;
  2235.  
  2236.    if(pagetype > PLEGAL)
  2237.    {
  2238.     adpagedef[PLAND].ob_state = SELECTED;        /* offset by 4    */
  2239.     adpagedef[pagetype - 4].ob_state = SELECTED;    /* for index      */
  2240.    }
  2241.    else
  2242.    {
  2243.      adpagedef[PPORT].ob_state = SELECTED;
  2244.      adpagedef[pagetype].ob_state  = SELECTED;
  2245.    }
  2246.    pagetmp = pagetype;
  2247.  
  2248.    button = execform(adpagedef,0);
  2249.    adpagedef[button].ob_state = NORMAL;
  2250.    if(button == PSIZEOK)
  2251.    {
  2252.     for(i=PA4;i<=PLEGAL;i++)
  2253.     {
  2254.        if(adpagedef[i].ob_state == SELECTED)
  2255.        {
  2256.         pagetype = i;
  2257.         if(adpagedef[PLAND].ob_state == SELECTED)
  2258.                 pagetype += 4;            /* offset to landscape*/
  2259.             if(pagetype == PLEGAL + 4)
  2260.         {
  2261.            if((view_size == PADJCNT) || (view_size == P200))
  2262.                             goto cancel;
  2263.            menu_ienable(ad_menu,PADJCNT,FALSE);
  2264.            menu_ienable(ad_menu,P200,FALSE);
  2265.             }
  2266.                 else
  2267.                 {
  2268.            menu_ienable(ad_menu,PADJCNT,TRUE);
  2269.            menu_ienable(ad_menu,P200,TRUE);
  2270.                 }
  2271.         hpage_size = pagemux[pagetype - PA4];
  2272.         vpage_size = pagemuy[pagetype - PA4];
  2273.         mutomem(hpage_size,vpage_size,&scan_xres,&scan_yres);
  2274.               page_area.g_x = page_area.g_y = 0L;
  2275.                 gsx_moff();
  2276.                 vsf_interior(shandle,0);            /* Set to Solid   */
  2277.               if((view_size == PSIZE) ||
  2278.            (view_size == PADJCNT))
  2279.              pdraw_fit(view_size);
  2280.               else
  2281.              pdraw_scale();
  2282.               zoom_setup();
  2283.               cur_scale = get_scale_num(view_size);
  2284.               get_work(prev_handle);
  2285.               update_preview_blit();
  2286.               set_clip(TRUE,&pwork);
  2287.               vr_recfl(shandle,pxy);
  2288.               set_clip(FALSE,&pwork);
  2289.               gsx_mon();
  2290.               clear_window(prev_handle,2,1);
  2291.               set_clip(TRUE,&pwork);
  2292.               init_rulers();
  2293.               force_preview();
  2294.               slider_chk();
  2295.               set_clip(TRUE,&dpwork);
  2296.        }
  2297.     }
  2298.    }
  2299.    else
  2300.    {
  2301. cancel:
  2302.     pagetype = pagetmp;
  2303.     for(i=PA4;i<=PLEGAL;i++)
  2304.         adpagedef[i].ob_state = NORMAL;
  2305.     adpagedef[PPORT].ob_state = NORMAL;
  2306.     adpagedef[PLAND].ob_state = NORMAL;
  2307.  
  2308.         if(pagetype > PLEGAL)
  2309.     {
  2310.        adpagedef[pagetype-4].ob_state  = SELECTED;
  2311.        adpagedef[PLEGAL].ob_state = SELECTED;
  2312.     }
  2313.     else
  2314.     {
  2315.        adpagedef[pagetype].ob_state  = SELECTED;
  2316.        adpagedef[PPORT].ob_state = SELECTED;
  2317.     }
  2318.    }
  2319. }
  2320.  
  2321.  
  2322.  
  2323.  
  2324.  
  2325. /**************************************************************************/
  2326. /* Function: do_clip_dialog()                          */
  2327. /* Description: clip board dialog box...                  */
  2328. /**************************************************************************/
  2329. do_clip_dialog()
  2330. {
  2331.    int button;
  2332.    int fromval,toval;
  2333.    register int i;
  2334.  
  2335.    set_int(adclipobj,CLFROM,curr_page);
  2336.    set_int(adclipobj,CLTO,curr_page);
  2337.  
  2338.    button = execform(adclipobj,CLTO);
  2339.    if(button == CLOK)
  2340.    {
  2341.       adclipobj[CLOK].ob_state = NORMAL;
  2342.       fromval = get_int(adclipobj,CLFROM);
  2343.       toval   = get_int(adclipobj,CLTO);
  2344.       if(toval < fromval)
  2345.      toval = fromval;
  2346.       if(adclipobj[CLCUR].ob_state == SELECTED)
  2347.       {            
  2348.          clip_to_page(curr_page);
  2349.       }
  2350.       else if(adclipobj[CLALL].ob_state == SELECTED)
  2351.       {
  2352.      for(i = fromval; i <= toval;i++)
  2353.      {
  2354.         if(!clip_to_page(i))
  2355.         break;
  2356.      }
  2357.       }
  2358.       else if(adclipobj[CLEVEN].ob_state == SELECTED)
  2359.       {
  2360.      for(i = fromval; i <= toval;i++)
  2361.      {
  2362.         if(!(i & 1))        /* Only even numbers */
  2363.         {
  2364.         if(!clip_to_page(i))
  2365.            break;
  2366.         }
  2367.      }
  2368.       }
  2369.       else 
  2370.       {
  2371.     for(i = fromval; i <= toval; i++)
  2372.     {
  2373.        if(i & 1)
  2374.        {
  2375.         if(!clip_to_page(i))
  2376.            break;
  2377.        }
  2378.     }
  2379.       }
  2380.       force_draw_flag = TRUE;
  2381.       force_preview();
  2382.       menu_ienable(ad_menu,ACREATE,1);
  2383.    }
  2384.    else
  2385.     adclipobj[CLCANCEL].ob_state = NORMAL;
  2386. }
  2387.  
  2388.  
  2389.  
  2390.  
  2391.  
  2392. /**************************************************************************/
  2393. /* Function: do_rcoord()                          */
  2394. /* Description: Handle typed in coordinates of regions              */
  2395. /**************************************************************************/
  2396. do_rcoord()
  2397. {
  2398.      int button;
  2399.      long *str1;
  2400.      int  page;
  2401.      int  type;
  2402.      int  bx1,by1,bx2,by2;
  2403.      int  cx1,cy1,cx2,cy2;
  2404.      int  sobj;
  2405.      int  x,y,w,h;
  2406.  
  2407.    if(region_ptr)
  2408.    {
  2409.      check_top_window();
  2410.      find_boundary(region_ptr,&bx1,&by1,&bx2,&by2,&type,&page);
  2411.  
  2412.  
  2413.      int_mu_hlrv(ad_rcoord,bx1,RUPLEFT);
  2414.      int_mu_vlrv(ad_rcoord,by1,RUPRIGHT);
  2415.      int_mu_hlrv(ad_rcoord,bx2-bx1,REGWIDTH);
  2416.      int_mu_vlrv(ad_rcoord,by2-by1,RHEIGHT);
  2417.  
  2418.      str1 = ad_rcoord[REGUNITS].ob_spec;
  2419.      strcpy(*str1,rcoord_unit[unit_type]);
  2420.      form_center(ad_rcoord,&x,&y,&w,&h);
  2421.      form_dial(0,0,0,36,36,x,y,w,h);
  2422.      objc_draw(ad_rcoord,0,MAX_DEPTH,x,y,w,h);
  2423.  
  2424.      sobj = RUPLEFT;     
  2425.  
  2426. err:
  2427.      button = form_do(ad_rcoord,sobj);
  2428.  
  2429.      ad_rcoord[button].ob_state = NORMAL;
  2430.      if(button == ROK)
  2431.      {
  2432.  
  2433.         if(!parmcheck(ad_rcoord,RUPLEFT,1,1))   /* Upper left */
  2434.         {
  2435.       cx1 = Pval;
  2436.           if(!parmcheck(ad_rcoord,RUPRIGHT,3,1))/* upper right*/
  2437.       {
  2438.         cy1 = Pval;
  2439.             if(!parmcheck(ad_rcoord,REGWIDTH,1,1))/* lower left */
  2440.         {
  2441.           cx2 = Pval;
  2442.               if(!parmcheck(ad_rcoord,RHEIGHT,3,1))/* lower right*/
  2443.           {
  2444.             cy2 = Pval; 
  2445.             do_trans_scale(bx1,by1,bx2-bx1,by2-by1,
  2446.                cx1,cy1,cx2,cy2,type);
  2447.           }
  2448.           else
  2449.           {
  2450.                objc_draw(ad_rcoord,button,1,x,y,w,h);
  2451.         sobj = RHEIGHT;
  2452.         goto err;
  2453.           }
  2454.         }
  2455.         else
  2456.         {
  2457.                objc_draw(ad_rcoord,button,1,x,y,w,h);
  2458.         sobj = REGWIDTH;
  2459.         goto err;
  2460.         }
  2461.       }
  2462.       else
  2463.       {
  2464.               objc_draw(ad_rcoord,button,1,x,y,w,h);
  2465.          sobj = RUPRIGHT;
  2466.          goto err;
  2467.       }
  2468.         }      /*if(!parmcheck(ad_pcoord,PUPLEFT,1))*/
  2469.     else
  2470.     {
  2471.            objc_draw(ad_rcoord,button,1,x,y,w,h);
  2472.        sobj = RUPLEFT;
  2473.        goto err;
  2474.     }
  2475.      }
  2476.    }
  2477.    form_dial(3,0,0,3,36,x,y,w,h);
  2478.    clear_regprim_flags();
  2479.    do_blit();
  2480. }
  2481.  
  2482.  
  2483.  
  2484. /**************************************************************************/
  2485. /* Function: do_set_paths()                          */
  2486. /* Description: Handle Default Path dialog box                  */
  2487. /**************************************************************************/
  2488. do_set_paths()
  2489. {
  2490.    int button;
  2491.  
  2492.    button = execform(ad_paths,PATHTEXT);
  2493.    ad_paths[button].ob_state = NORMAL;
  2494.    
  2495.    if(button == PATHOK)                /* save paths */
  2496.    {
  2497.       dpath1 = get_edit(ad_paths,PATHTEXT);
  2498.       dpath2 = get_edit(ad_paths,PATHCLIP);
  2499.       dpath3 = get_edit(ad_paths,PATHGRAP);
  2500.       dpath4 = get_edit(ad_paths,PATHDOC);    
  2501.  
  2502.       write_paths(dpath1,dpath2,dpath3,dpath4);
  2503.    }
  2504.    else                        /* restore    */
  2505.    {
  2506.       restore_paths(dpath1,dpath2,dpath3,dpath4);
  2507.       set_tedit(ad_paths,PATHTEXT,dpath1);
  2508.       set_tedit(ad_paths,PATHCLIP,dpath2);
  2509.       set_tedit(ad_paths,PATHGRAP,dpath3);
  2510.       set_tedit(ad_paths,PATHDOC,dpath4);    
  2511.    }
  2512. }
  2513.  
  2514.  
  2515.  
  2516. /**************************************************************************/
  2517. /* Function: set_tedit()                          */
  2518. /* Description: Insert Text into Text Dialog Field              */
  2519. /**************************************************************************/
  2520. set_tedit(tree,object,str)
  2521. OBJECT *tree;
  2522. int object;
  2523. char *str;
  2524. {
  2525.     long *str1;
  2526.  
  2527.      str1 = tree[object].ob_spec;
  2528.      strcpy(*str1,str);
  2529. }
  2530.  
  2531.  
  2532. /**************************************************************************/
  2533. /* Function: get_edit()                              */
  2534. /* Description: Get text from Editable Text Dialog Field          */
  2535. /**************************************************************************/
  2536. char *get_edit(tree,obj)
  2537. OBJECT *tree;
  2538. int obj;
  2539. {
  2540.     long *str1;
  2541.  
  2542.     str1 = tree[obj].ob_spec;
  2543.     return(*str1);
  2544. }
  2545.  
  2546.  
  2547.  
  2548.  
  2549. /**************************************************************************/
  2550. /* Function: do_pcoord()                          */
  2551. /* Description: Handle primitive type in coordinates dialog box          */
  2552. /**************************************************************************/
  2553. do_pcoord()
  2554. {
  2555.      int button;
  2556.      long *str1;
  2557.      int  type;
  2558.      int  bx1,by1,bx2,by2;
  2559.      int  cx1,cy1,cx2,cy2;
  2560.      int opcode,pcount;
  2561.      unsigned long rptr;
  2562.      int sobj;
  2563.      int x,y,w,h;
  2564.  
  2565.      if(!region_ptr)
  2566.      {
  2567.     clear_regprim_flags();        /* if no region, ergo, no prim  */
  2568.     do_blit();
  2569.     return;                /* ergo, clean up and return    */
  2570.      }
  2571.  
  2572.      rptr = get_curreg(&type);  
  2573.      opcode = get_cur_prim(&pcount,&wmode,&prim_ptr);
  2574.  
  2575.      if(prim_ptr)
  2576.      {
  2577.        calc_prim(opcode,&bx1,&by1,&bx2,&by2,pcount);
  2578.        check_top_window();
  2579.  
  2580.  
  2581.        int_mu_hlrv(ad_pcoord,bx1,PUPLEFT);
  2582.        int_mu_vlrv(ad_pcoord,by1,PUPRIGHT);
  2583.        int_mu_hlrv(ad_pcoord,bx2-bx1,PWIDTH);
  2584.        int_mu_vlrv(ad_pcoord,by2-by1,PHEIGHT);
  2585.  
  2586.        str1 = ad_pcoord[PRIMUNIT].ob_spec;
  2587.        strcpy(*str1,rcoord_unit[unit_type]);
  2588.  
  2589.  
  2590.      sobj = PUPLEFT;
  2591.      form_center(ad_pcoord,&x,&y,&w,&h);
  2592.      form_dial(0,0,0,36,36,x,y,w,h);
  2593.      objc_draw(ad_pcoord,0,MAX_DEPTH,x,y,w,h);
  2594.  
  2595. err:
  2596.        button = form_do(ad_pcoord,sobj);
  2597.  
  2598.        ad_pcoord[button].ob_state = NORMAL;
  2599.  
  2600.        if(button == POK)
  2601.        {
  2602.       if(!parmcheck(ad_pcoord,PUPLEFT,1,1))
  2603.           {
  2604.         cx1 = Pval;
  2605.  
  2606.         if(!parmcheck(ad_pcoord,PUPRIGHT,3,1))
  2607.         {
  2608.           cy1 = Pval;
  2609.           if(!parmcheck(ad_pcoord,PWIDTH,1,1))
  2610.           {
  2611.             cx2 = Pval;
  2612.             if(!parmcheck(ad_pcoord,PHEIGHT,3,1))
  2613.         {
  2614.             cy2 = Pval;
  2615.  
  2616.             scale_prim_coord(opcode,bx1,by1,bx2-bx1,by2-by1,
  2617.                      cx1,cy1,cx2,cy2,type,pcount,wmode);
  2618.         }
  2619.         else
  2620.         {
  2621.                   objc_draw(ad_pcoord,button,1,x,y,w,h);
  2622.           sobj = PHEIGHT;
  2623.           goto err;
  2624.         }
  2625.           }
  2626.           else
  2627.           {
  2628.                 objc_draw(ad_pcoord,button,1,x,y,w,h);
  2629.         sobj = PWIDTH;
  2630.         goto err;
  2631.           }
  2632.         }
  2633.         else
  2634.         {
  2635.               objc_draw(ad_pcoord,button,1,x,y,w,h);
  2636.           sobj = PUPRIGHT;
  2637.           goto err;
  2638.         }
  2639.           }      /*if(!parmcheck(ad_pcoord,PUPLEFT,1))  */
  2640.       else
  2641.       {
  2642.             objc_draw(ad_pcoord,button,1,x,y,w,h);
  2643.         sobj = PUPLEFT;
  2644.         goto err;
  2645.       }
  2646.        }
  2647.      }
  2648.      form_dial(3,0,0,3,36,x,y,w,h);
  2649.      clear_regprim_flags();
  2650.      do_blit();                /* always clear primitives and regions*/
  2651.                     /* and screen of markings after this  */
  2652. }
  2653.  
  2654.  
  2655.  
  2656.  
  2657. /**************************************************************************/
  2658. /* Function: set_template()                          */
  2659. /* Description: Set template usage dialog box                  */
  2660. /**************************************************************************/
  2661. set_template()
  2662. {
  2663.    register int i;
  2664.    int button;
  2665.  
  2666.    for(i=SETTBOTH;i<=SETTRITE;i++)
  2667.     ad_settmpl[i].ob_state = NORMAL;
  2668.    ad_settmpl[disp_type + SETTBOTH].ob_state = SELECTED;
  2669.  
  2670.    ad_settmpl[SETTFRNT].ob_state = NORMAL;
  2671.    ad_settmpl[SETTBACK].ob_state = NORMAL;
  2672.  
  2673.    if(disp_pos)
  2674.     ad_settmpl[SETTBACK].ob_state = SELECTED;
  2675.    else
  2676.     ad_settmpl[SETTFRNT].ob_state = SELECTED;
  2677.    
  2678.    button = execform(ad_settmpl,0);
  2679.    ad_settmpl[button].ob_state = NORMAL;
  2680.    
  2681.    if(button == SETTOK)
  2682.    {
  2683.      for(i=SETTBOTH;i<=SETTRITE;i++)
  2684.      {
  2685.       if(ad_settmpl[i].ob_state == SELECTED)
  2686.             disp_type = i - SETTBOTH;
  2687.      }
  2688.                         /* 0 = front 1 = back */
  2689.      disp_pos=((ad_settmpl[SETTFRNT].ob_state==SELECTED)?(0):(1));
  2690.      force_preview();
  2691.    }
  2692. }
  2693.  
  2694.  
  2695.  
  2696. /**************************************************************************/
  2697. /* Function: page_numbering()                          */
  2698. /* Description: Handle page numbering dialog box              */
  2699. /**************************************************************************/
  2700. page_numbering()
  2701. {
  2702.     int button;
  2703.     long *str1;
  2704.     long *str3;
  2705.     long *str4;
  2706.     long *str5;
  2707.     long str2;
  2708.     int fnt;
  2709.     int ptsize;
  2710.     int setsize;
  2711.     int pxy[4];
  2712.     int x,y,w,h;
  2713.     int x1,y1;
  2714.     int curvpos;
  2715.     int curdflag;
  2716.     char text[PTEXTMAX];    
  2717.     register int i;
  2718.     int lcurjust;
  2719.     int rcurjust;
  2720.     int curusage;
  2721.     register int findex;
  2722.     int *fntptr;
  2723.     int found;
  2724.     int fpage,tpage;
  2725.     int minpage,maxpage;
  2726.     int tmppage;
  2727.     int sobj;
  2728.     int lowend = 0;
  2729.  
  2730.     fnt = pnum.pfnum;
  2731.     ptsize = pnum.pptsize;;
  2732.     setsize = pnum.pstsize;
  2733.     curvpos = pnum.vpos;
  2734.     curdflag = pnum.display;
  2735.     strcpy(text,pnum.text);
  2736.     lcurjust = pnum.ljust;
  2737.     rcurjust = pnum.rjust;
  2738.     curusage = pnum.usage;
  2739.     fpage = pnum.fpage;
  2740.     tpage = pnum.tpage;
  2741.  
  2742.     maxpage = minpage = 0;    
  2743.     if(get_fpage(&minpage))
  2744.     {
  2745.      maxpage = minpage;
  2746.      while(get_npage(&tmppage))
  2747.      {
  2748.     maxpage = tmppage;
  2749.      }
  2750.     }
  2751.      
  2752. /*
  2753.      fpage = max(fpage,minpage);
  2754.      tpage = min(tpage,maxpage);
  2755. */
  2756.    fpage = minpage;            /* Slam to max and min of REAL Pages*/
  2757.    tpage = maxpage;              /* Regardless of what they've typed */
  2758.    if(tpage < fpage)            /* in....                */
  2759.         tpage = fpage;
  2760.  
  2761.     set_int(ad_pagenum,PNUMFROM,fpage);
  2762.     set_int(ad_pagenum,PNUMTO,tpage);
  2763.  
  2764.     /* to display or not */
  2765.     ad_pagenum[PDISPNUM].ob_state = ((curdflag)?(CHECKED):(NORMAL));
  2766.  
  2767.  
  2768.     findex = found = 0;
  2769.     for(findex = 0;findex < 16;findex++)
  2770.     {
  2771.     fntptr = ftlib + (findex*SFTSIZ);
  2772.     if(fnt == *fntptr)
  2773.     {
  2774.       found = 1;
  2775.       break;
  2776.     }
  2777.     }
  2778.     str1 = ad_pagenum[PFNAME].ob_spec;        /* Font name and number*/
  2779.     if(!found)
  2780.     {
  2781.        findex = -1;
  2782.        lowend = -1;
  2783.        str2 = " ";
  2784.            set_int(ad_pagenum,PFNUM,fnt);
  2785.     }
  2786.     else
  2787.     {
  2788.        set_int(ad_pagenum,PFNUM,*fntptr);
  2789.        str2 = ftlib + ((findex * SFTSIZ)+TFNOFS);
  2790.     }
  2791.     strcpy(*str1,str2);
  2792.  
  2793.     to_mu_pt12(ad_pagenum,ptsize,PPOINTS);   /* Point size*/
  2794.     to_mu_pt12(ad_pagenum,setsize,PSETSIZE); /* Set size  */
  2795.  
  2796.     str3 = ad_pagenum[PAGEUNIT].ob_spec;    /* units - inches etc...*/
  2797.     strcpy(*str3,rcoord_unit[unit_type]);
  2798.  
  2799.     str4 = ad_pagenum[PTDIST].ob_spec;        /* Text for distance    */
  2800.     strcpy(*str4,dpagenum[curvpos]);
  2801.  
  2802.     str5 = ad_pagenum[PSTRING].ob_spec;
  2803.     strcpy(*str5,text);
  2804.  
  2805.  
  2806.     to_mu_vlrv(ad_pagenum,pnum.distance,PDIST);
  2807.  
  2808.     for(i=PLJLEFT;i<=PLJRIGHT;i++)
  2809.     {
  2810.        ad_pagenum[i].ob_state = NORMAL;
  2811.     }
  2812.     ad_pagenum[lcurjust + PLJLEFT].ob_state = SELECTED;
  2813.  
  2814.  
  2815.     for(i=PRJLEFT;i<=PRJRIGHT;i++)
  2816.     {
  2817.        ad_pagenum[i].ob_state = NORMAL;
  2818.     }
  2819.     ad_pagenum[rcurjust + PRJLEFT].ob_state = SELECTED;
  2820.  
  2821.  
  2822.     for(i=PLEFT;i<=PBOTH;i++)
  2823.     {
  2824.     ad_pagenum[i].ob_state = NORMAL;
  2825.     }
  2826.     ad_pagenum[curusage + PLEFT].ob_state = SELECTED;
  2827.  
  2828.     for(i=PTOP;i<=PBOTTOM;i++)
  2829.     {
  2830.     ad_pagenum[i].ob_state = NORMAL;
  2831.     }
  2832.     ad_pagenum[curvpos + PTOP].ob_state = SELECTED;
  2833.  
  2834.     form_center(ad_pagenum,&x,&y,&w,&h);
  2835.     form_dial(0,0,0,36,36,x,y,w,h);
  2836.     objc_draw(ad_pagenum,0,MAX_DEPTH,x,y,w,h);
  2837.     objc_offset(ad_pagenum,PFNAME,&x1,&y1);
  2838.     pxy[0] = x1;
  2839.     pxy[1] = y1;
  2840.     pxy[2] = x1 + ad_pagenum[PFNAME].ob_width - 1;
  2841.     pxy[3] = y1 + ad_pagenum[PFNAME].ob_height - 1;
  2842.     vsf_interior(shandle,0);
  2843.  
  2844.     sobj = PFNUM;
  2845. err:do
  2846.     {
  2847.       button = form_do(ad_pagenum,sobj);
  2848.       button &= 0x7fff;
  2849.       switch(button)
  2850.       {
  2851.     case PLARROW:
  2852.     case PRARROW:
  2853.              findex = ((button==PRARROW)?(findex + 1):(findex-1));
  2854.              if(findex < lowend)        /* 0 or -1 */
  2855.                findex = 15;
  2856.              if(findex > 15)
  2857.                findex = lowend;        /* 0 or -1 */
  2858.              if( findex == -1 )
  2859.             str2 = " ";
  2860.              else
  2861.                 str2 = ftlib + ((findex * SFTSIZ)+TFNOFS);
  2862.  
  2863.              strcpy(*str1,str2);
  2864.              v_bar(shandle,pxy);
  2865.              objc_draw(ad_pagenum,PFNAME,1,x,y,w,h);
  2866.              fntptr = ftlib + (findex*SFTSIZ);
  2867.              if(findex == -1 )
  2868.             set_int( ad_pagenum,PFNUM,fnt );
  2869.              else
  2870.                 set_int(ad_pagenum,PFNUM,*fntptr);
  2871.              objc_draw(ad_pagenum,PFNUM,1,x,y,w,h);
  2872.              break;
  2873.  
  2874.     case PDISPNUM:curdflag^=TRUE; 
  2875.                       ad_pagenum[PDISPNUM].ob_state=((curdflag)?(CHECKED):(NORMAL));
  2876.               objc_draw(ad_pagenum,PDISPNUM,1,x,y,w,h);
  2877.               break;
  2878.     
  2879.     case PTOP:
  2880.     case PBOTTOM: curvpos = ((button == PTOP)?(0):(1));
  2881.               strcpy(*str4,dpagenum[curvpos]);
  2882.               objc_draw(ad_pagenum,PTDIST,1,x,y,w,h);
  2883.               break;
  2884.  
  2885.         
  2886.     default:
  2887.              break;
  2888.       }
  2889.     }while((button != PAGEOK) && (button != PAGECANC));
  2890.  
  2891.  
  2892.     ad_pagenum[button].ob_state = NORMAL;
  2893.     if(button == PAGEOK)
  2894.     {
  2895.     do_font_info(ad_pagenum,PFNUM,999,1,&pnum.pfnum); /* get font number */
  2896.  
  2897.  
  2898.     if(!parmcheck(ad_pagenum,PPOINTS,2,0))
  2899.                 pnum.pptsize = Pval;
  2900.       else
  2901.     {
  2902.       sobj = PPOINTS;
  2903.           objc_draw(ad_pagenum,button,1,x,y,w,h);
  2904.       goto err;
  2905.     }
  2906.  
  2907.     if(!parmcheck(ad_pagenum,PSETSIZE,2,0))
  2908.                 pnum.pstsize = Pval;
  2909.     else
  2910.     {
  2911.        sobj = PSETSIZE;
  2912.            objc_draw(ad_pagenum,button,1,x,y,w,h);
  2913.        goto err;
  2914.     }
  2915.  
  2916.     pnum.display = (ad_pagenum[PDISPNUM].ob_state == CHECKED);
  2917.  
  2918. /*
  2919.         fpage = max(get_int(ad_pagenum,PNUMFROM),minpage);
  2920.         tpage = min(get_int(ad_pagenum,PNUMTO),maxpage);
  2921. */
  2922.     fpage = minpage;        /* always slam it to max and */
  2923.     tpage = maxpage;        /* min number of REAL pages  */
  2924.         if(tpage < fpage)
  2925.         tpage = fpage;
  2926.     pnum.fpage = fpage;
  2927.         pnum.tpage = tpage;
  2928.  
  2929.     if(!parmcheck(ad_pagenum,PDIST,3,0))
  2930.             pnum.distance = Pval;
  2931.     else
  2932.     {
  2933.       sobj = PDIST;
  2934.           objc_draw(ad_pagenum,button,1,x,y,w,h);      
  2935.       goto err;
  2936.     }
  2937.  
  2938.     for(i=PLJLEFT;i<=PLJRIGHT;i++)
  2939.     {
  2940.        if(ad_pagenum[i].ob_state == SELECTED)
  2941.             pnum.ljust = i - PLJLEFT;
  2942.     }
  2943.  
  2944.  
  2945.     for(i=PRJLEFT;i<=PRJRIGHT;i++)
  2946.     {
  2947.        if(ad_pagenum[i].ob_state == SELECTED)
  2948.             pnum.rjust = i - PRJLEFT;
  2949.     }
  2950.  
  2951.     for(i=PLEFT;i<=PBOTH;i++)
  2952.     {
  2953.        if(ad_pagenum[i].ob_state == SELECTED)
  2954.             pnum.usage = i - PLEFT;
  2955.     }    
  2956.     
  2957.     for(i=PTOP;i<=PBOTTOM;i++)
  2958.     {
  2959.        if(ad_pagenum[i].ob_state == SELECTED)
  2960.                 pnum.vpos = i-PTOP;
  2961.     }
  2962.     strcpy(pnum.text,*str5);    
  2963.         pnum.tattrib.ptsz = pnum.pptsize;
  2964.         pnum.tattrib.font = pnum.pfnum;
  2965.     pnum.tattrib.ssiz = pnum.pstsize;
  2966.         pnum.tattrib.lnsp = (long)pttomu(pnum.pptsize/8);
  2967.     }
  2968.     form_dial(3,0,0,3,36,x,y,w,h);
  2969.     force_preview();
  2970.  
  2971. }
  2972.  
  2973.  
  2974.  
  2975. /**************************************************************************/
  2976. /* Function: do_dpi()                              */
  2977. /* Description: Set dpi for large monitors...                  */
  2978. /**************************************************************************/
  2979. do_dpi()
  2980. {
  2981.    int button;
  2982.    int xin,yin;
  2983.    long totalm;
  2984.    int dxres,dyres;
  2985.    long sbytes,pbytes;
  2986.  
  2987.    set_int(ad_dpi,HDPIDAT,axdpi[0]);
  2988.    set_int(ad_dpi,VDPIDAT,aydpi[0]);
  2989.  
  2990.    button = execform(ad_dpi,HDPIDAT);
  2991.    ad_dpi[button].ob_state = NORMAL;
  2992.    if(button == DOTOK)
  2993.    {
  2994.         xin = get_int(ad_dpi,HDPIDAT);
  2995.     yin = get_int(ad_dpi,VDPIDAT);
  2996.  
  2997.     totalm = Malloc(-1L);
  2998.         totalm += scan_bytes + prev_bytes;
  2999.  
  3000.     dxres = xin * 8;    /* max page sizes in inches */
  3001.         dyres = yin * 14;
  3002.         sbytes = ((((long)dxres) * (long)dyres)/ 8L);
  3003.     pbytes = sbytes * 4L;   /* for 200% size  */
  3004.  
  3005.         if((sbytes + pbytes) < totalm)
  3006.         {
  3007.         Mfree(scanesc);    /* free both buffers...*/
  3008.         Mfree(pagesc);
  3009.         scan_bytes = sbytes;
  3010.         pagebytes = prev_bytes = pbytes;
  3011.         scanptr = scanesc = (unsigned long)Malloc(scan_bytes);
  3012.         page_ptr = pagesc = (unsigned long)Malloc(prev_bytes);
  3013.  
  3014.         axdpi[0] = axdpi[1] = axdpi[2] = xin;
  3015.         aydpi[0] = aydpi[1] = aydpi[2] = yin;
  3016.  
  3017.          half_xdpi[0] = half_xdpi[1] = half_xdpi[2] = xin/2;
  3018.         half_ydpi[0] = half_ydpi[1] = half_ydpi[2] = yin/2;
  3019.  
  3020.         sdevm = 0;
  3021.         xdpi[0] = xin;
  3022.         ydpi[0] = yin;
  3023.  
  3024.             mutomem(hpage_size,vpage_size,&scan_xres,&scan_yres);        
  3025.             page_MFDB.fd_addr = page_ptr;         /* Preview address MFDB */
  3026.  
  3027.         mutopage(hpage_size,vpage_size,&mxres,&myres,1);
  3028.  
  3029.               page_area.g_x = page_area.g_y = 0L;
  3030.  
  3031.         gsx_moff();
  3032.               vsf_interior(shandle,0);            /* Set to Solid   */
  3033.  
  3034.               GDvq_extnd(mhandle,0,intout,mxres,myres,&page_ptr);        
  3035.  
  3036.  
  3037.               if( (view_size == PSIZE) ||
  3038.           (view_size == PADJCNT))
  3039.              pdraw_fit(view_size);
  3040.         else
  3041.                 pdraw_scale();
  3042.         zoom_setup();
  3043.               cur_scale = get_scale_num(view_size);
  3044.               get_work(prev_handle);
  3045.               update_preview_blit();
  3046.               set_clip(TRUE,&pwork);
  3047.               vr_recfl(shandle,pxy);
  3048.               clear_window(prev_handle,2,1);
  3049.               init_rulers();
  3050.  
  3051.               set_clip(TRUE,&dpwork);
  3052.               gsx_mon();
  3053.           world_setup();            /* Redo mu conversion table */
  3054.             IF_close();
  3055.         IF_open(0);
  3056.         recalc_alt_text();
  3057.  
  3058.         force_preview();
  3059.             slider_chk();
  3060.         }
  3061.     else
  3062.        alert_cntre(ALERT33);    /* not enough memory ...*/
  3063.    }
  3064.    /* cancel? axdpi[] and aydpi[] will stil be the same...    */
  3065. }
  3066.  
  3067.  
  3068.  
  3069.  
  3070. /**************************************************************************/
  3071. /* Function: set_parameters();                          */
  3072. /* Description: Save current parameters as default for startup.          */
  3073. /**************************************************************************/
  3074. save_parameters()
  3075. {
  3076.   register int i;
  3077.   int grid_unit;
  3078.   int length;
  3079.  
  3080.      if(alert_cntre(ALERT34)==1)             /* hit ok, so save...  */
  3081.      {
  3082.     pstorage[0]  =      view_size;           /* Preview Size      */
  3083.     pstorage[1]  =      ruler_flag;           /* Ruler Display      */
  3084.     pstorage[2]  =      unit_type;           /* Ruler Units      */
  3085.  
  3086.     for(i=GRBUT1;i<=GRBUT4;i++)
  3087.     {
  3088.        if(gridspace[i].ob_state == SELECTED)
  3089.                     grid_unit = i;
  3090.     }
  3091.     pstorage[3]  =     grid_unit;           /* Grid Spacing...     */ 
  3092.  
  3093.     pstorage[4]  =      show_grids;           /* Grid Display      */
  3094.     pstorage[5]  =      snap_to_grids;           /* Snap To Grid...     */
  3095.  
  3096.         pstorage[6]  =   get_int(ad_dpi,HDPIDAT);  /* xdpi for moniterm   */
  3097.     pstorage[7]  =   get_int(ad_dpi,VDPIDAT);  /* ydpi for moniterm   */
  3098.  
  3099.     pstorage[8]  =      gltxtattr.font;       /* Global Font      */
  3100.     pstorage[9]  =      gltxtattr.ptsz;       /* Global Point Size   */
  3101.     pstorage[10] =      gltxtattr.ssiz;       /* Global Set Size     */
  3102.     pstorage[11] =      (int)gltxtattr.lnsp;       /* Global Line Space   */
  3103.     pstorage[12] =      gltxtattr.kernmd;       /* Global Kerning...   */
  3104.     pstorage[13] =      gltxtattr.rvomd;       /* Reverse Video      */
  3105.     pstorage[14] =      gltxtattr.jstmd;       /* Justification      */
  3106.     pstorage[15] =      pagetype;           /* Paper Type      */
  3107.     pstorage[16] =      gltxtattr.scoff;       /* Scan Offset      */
  3108.     pstorage[17] =      gl_fstyle;           /* Fill Style      */
  3109.     pstorage[18] =      gl_findex;           /* Fill Index      */
  3110.     pstorage[19] =      gl_lstyle;           /* Line Style      */
  3111.     pstorage[20] =      gl_lwidth;           /* Line Width      */
  3112.     pstorage[21] =      gl_repel;           /* Repel Mode      */
  3113.     pstorage[22] =      gl_repbounds;           /* Repel Bounds      */
  3114.     pstorage[23] =      gl_repoffset;           /* Boundary Offset     */
  3115.     pstorage[24] =      pnum.pfnum;           /* Page Number Font    */
  3116.     pstorage[25] =      pnum.pptsize;           /* Page Num Pt Size    */
  3117.     pstorage[26] =      pnum.pstsize;           /* Page Num Set Size   */
  3118.     pstorage[27] =      pnum.display;           /* Page Num Display    */
  3119.     pstorage[28] =      pnum.ljust;           /* Page Num Left Just  */
  3120.     pstorage[29] =      pnum.rjust;           /* Page Num Right Just */
  3121.     pstorage[30] =      pnum.usage;           /* Page Num Usage      */
  3122.     pstorage[31] =      pnum.vpos;           /* Page Num Vert. Pos  */
  3123.     pstorage[32] =      (int)pnum.distance;       /* Page Num Distance   */
  3124.     pstorage[33] =      pnum.fpage;           /* Page Num From...    */
  3125.     pstorage[34] =      pnum.tpage;           /* Page Num To...      */
  3126.     pstorage[35] =      disp_type;           /* Template Usage...   */
  3127.     pstorage[36] =      disp_pos;           /* Template Location   */
  3128.     pstorage[37] =   gltxtattr.mcomp;       /* Manual Char. Comp.  */
  3129.     pstorage[38] =   gltxtattr.acomp;          /* Auto. Char Comp.    */
  3130.     pstorage[39] =   gltxtattr.hypmd;       /* Hyphenation Mode    */
  3131.     pstorage[40] =   gltxtattr.nsuchyp;       /* No. Of Succ. Hyphens*/
  3132.     pstorage[41] =   gltxtattr.nbefhyp;       /* No. of chars Before */
  3133.     pstorage[42] =   gltxtattr.nafthyp;       /* No. of chars After  */
  3134.     pstorage[43] =   gltxtattr.ltsmd;       /* Letterspacing mode  */
  3135.     pstorage[44] =   gltxtattr.plts;       /* Pos. Letter Spacing */
  3136.     pstorage[45] =   gltxtattr.nlts;       /* Neg. Letter Spacing */
  3137.     pstorage[46] =   gltxtattr.minsp;       /* Min. Space in RU      */
  3138.     pstorage[47] =   gltxtattr.prfsp;       /* Pref. Space In RU   */
  3139.     pstorage[48] =   gltxtattr.maxsp;       /* Max Space in RU     */
  3140.     pstorage[49] =   gltxtattr.psimd;       /* Pseudo Italic Mode  */
  3141.  
  3142.     length = strlen(pnum.text);
  3143.     pstorage[50] =      length;           /* Number of Chars     */
  3144.     strcpy(pnumtext,pnum.text);
  3145.  
  3146.     write_defaults();
  3147.      }
  3148. }
  3149.  
  3150.  
  3151.  
  3152.  
  3153. restore_defaults()
  3154. {
  3155.    register int i;
  3156.    int length;
  3157.    int grid_unit;
  3158.    register int *hval;
  3159.    register int *vval;
  3160.    register int **str;
  3161.  
  3162.    if(read_defaults())
  3163.    {
  3164.     view_size  = pstorage[0];           /* Preview Size      */
  3165.     ruler_flag = pstorage[1];           /* Ruler Display      */
  3166.     unit_type  = pstorage[2];           /* Ruler Units      */
  3167.  
  3168.     grid_unit    = pstorage[3];           /* Grid Spacing...     */ 
  3169.  
  3170.         switch(unit_type)
  3171.     {
  3172.         case 0:   str = grid_inch;
  3173.              hval = hinch_mus;
  3174.              vval = vinch_mus; 
  3175.               break;
  3176.            case 1:   str = grid_picas;
  3177.              hval = hpica_mus;
  3178.              vval = vpica_mus;
  3179.              break;
  3180.            case 2:   str = grid_cents;
  3181.              hval = hcent_mus;
  3182.              vval = vcent_mus;
  3183.              break;
  3184.            case 3:   str = grid_cicero;
  3185.              hval = hcicero_mus;
  3186.              vval = vcicero_mus;
  3187.              break;
  3188.     }
  3189.     for(i=GRBUT1;i<=GRBUT4;i++)
  3190.     {
  3191.        gridspace[i].ob_spec=str[i-GRBUT1];
  3192.        gridspace[i].ob_state=NORMAL;
  3193.     }
  3194.     gridspace[grid_unit].ob_state = SELECTED;
  3195.  
  3196.     hgridspace = hval[grid_unit - GRBUT1];
  3197.     vgridspace = vval[grid_unit - GRBUT1];
  3198.  
  3199.  
  3200.     show_grids    = pstorage[4];           /* Grid Display      */
  3201.     snap_to_grids = pstorage[5];           /* Snap To Grid...     */
  3202.  
  3203.         set_int(ad_dpi,HDPIDAT,pstorage[6]);       /* set dialog xdpi and */
  3204.         set_int(ad_dpi,VDPIDAT,pstorage[7]);       /* ydpi for moniterm   */
  3205.  
  3206.         init_tattr();                   /* Init Text Attributes*/
  3207.  
  3208.  
  3209.     pagetype         = pstorage[15];       /* Paper Type      */
  3210.     gl_fstyle        = pstorage[17];       /* Fill Style      */
  3211.  
  3212.     gl_findex      = pstorage[18];       /* Fill Index      */
  3213.     gl_lstyle      = pstorage[19];       /* Line Style      */
  3214.     gl_lwidth      = pstorage[20];       /* Line Width      */
  3215.  
  3216.     gl_repel     = pstorage[21];       /* Repel Mode      */
  3217.     gl_repbounds      = pstorage[22];       /* Repel Bounds      */
  3218.     gl_repoffset      = pstorage[23];       /* Boundary Offset     */
  3219.     pnum.pfnum      = pstorage[24];       /* Page Number Font    */
  3220.  
  3221.     pnum.pptsize     = pstorage[25];       /* Page Num Pt Size    */
  3222.     pnum.pstsize     = pstorage[26];       /* Page Num Set Size   */
  3223.     pnum.display     = pstorage[27];       /* Page Num Display    */
  3224.     pnum.ljust      = pstorage[28];       /* Page Num Left Just  */
  3225.     pnum.rjust       = pstorage[29];       /* Page Num Right Just */
  3226.  
  3227.     pnum.usage       = pstorage[30];       /* Page Num Usage      */
  3228.     pnum.vpos        = pstorage[31];       /* Page Num Vert. Pos  */
  3229.     pnum.distance    = (long)pstorage[32];       /* Page Num Distance   */
  3230.  
  3231.     pnum.fpage       = pstorage[33];       /* Page Num From...    */
  3232.     pnum.tpage       = pstorage[34];       /* Page Num To...      */
  3233.  
  3234.     disp_type        = pstorage[35];       /* Template Usage...   */
  3235.     disp_pos         = pstorage[36];       /* Template Location   */
  3236.  
  3237.     for(i=SETTBOTH;i<=SETTRITE;i++)
  3238.         ad_settmpl[i].ob_state = NORMAL;
  3239.     ad_settmpl[disp_type+SETTBOTH].ob_state = SELECTED;
  3240.  
  3241.     
  3242.         ad_settmpl[SETTFRNT].ob_state = NORMAL;
  3243.         ad_settmpl[SETTBACK].ob_state = NORMAL;
  3244.     
  3245.     if(disp_pos)
  3246.          ad_settmpl[SETTBACK].ob_state = SELECTED;
  3247.     else
  3248.          ad_settmpl[SETTFRNT].ob_state = SELECTED;
  3249.  
  3250.  
  3251.     length              = pstorage[50];       /* Number of Chars     */
  3252.     strcpy(pnum.text,pnumtext);
  3253.    }
  3254. }
  3255.  
  3256.  
  3257.  
  3258.  
  3259. set_text_defaults()
  3260. {
  3261.     int *fntptr;
  3262.  
  3263.         pstorage[9]  = 24*8;
  3264.     fntptr = ftlib;
  3265.     pstorage[8]  = *fntptr;
  3266.     pstorage[10] = 24*8;
  3267.     pstorage[11] = pttomu(26);
  3268.     pstorage[37] = 0;        /* Manual char. Compensation      */
  3269.     pstorage[38] = 0;        /* Auto. chr. Compensation        */
  3270.     pstorage[12] = 0;        /* Kerning              */
  3271.     pstorage[39] = 1;        /* Hyphenation              */
  3272.     pstorage[40] = 2;        /* No. of Successive Hyphens      */
  3273.     pstorage[41] = 2;        /* No. of chars Before Hyphen      */
  3274.     pstorage[42] = 3;        /* No. of chars After Hyphen      */
  3275.     pstorage[43] = 1;        /* Letterspacing Mode flag        */
  3276.     pstorage[44] = 3;        /* Positive Letter Space In RU    */
  3277.     pstorage[45] = 1;        /* Negative Letter Space In RU      */
  3278.     pstorage[46] = 12;        /* Minimum Space In RU          */
  3279.     pstorage[47] = 8;        /* Preferred Space in RU      */
  3280.     pstorage[48] = 30;        /* Maximum Space In RU          */
  3281.     pstorage[13] = 0;        /* Reverse Video Mode          */
  3282.     pstorage[49] = 0;        /* Pseudo Italic Mode Flag      */
  3283.     pstorage[14] = 0;        /* Justification Mode          */
  3284.     pstorage[16] = 0;        /* Scan Line Offset          */
  3285. }    
  3286.  
  3287.  
  3288.  
  3289.  
  3290. change_dpi()
  3291. {
  3292.    int xin,yin;
  3293.    long totalm;
  3294.    int dxres,dyres;
  3295.    long sbytes,pbytes;
  3296.  
  3297.     totalm = Malloc(-1L);
  3298.     totalm += scan_bytes + prev_bytes;
  3299.  
  3300.     xin = pstorage[6];
  3301.     yin = pstorage[7];
  3302.  
  3303.     dxres = xin * 8;   /* max page sizes in inches */
  3304.     dyres = yin * 14;
  3305.     sbytes = ((((long)dxres) * (long)dyres)/8L);
  3306.     pbytes = sbytes * 4L;                     /* for 200% size */
  3307.  
  3308.     if((sbytes + pbytes) < totalm)
  3309.     {
  3310.         Mfree(scanesc);    /* free both buffers...*/
  3311.         Mfree(pagesc);
  3312.         scan_bytes = sbytes;
  3313.         pagebytes = prev_bytes = pbytes;
  3314.         scanptr = scanesc = (unsigned long)Malloc(scan_bytes);
  3315.         page_ptr = pagesc = (unsigned long)Malloc(prev_bytes);
  3316.  
  3317.         axdpi[0] = axdpi[1] = axdpi[2] = xin;
  3318.         aydpi[0] = aydpi[1] = aydpi[2] = yin;
  3319.  
  3320.          half_xdpi[0] = half_xdpi[1] = half_xdpi[2] = xin/2;
  3321.         half_ydpi[0] = half_ydpi[1] = half_ydpi[2] = yin/2;
  3322.  
  3323.         xdpi[0] = xin;
  3324.         ydpi[0] = yin;
  3325.  
  3326. /*
  3327.         scan_xres = axdpi[0] * 8;
  3328.         scan_yres = aydpi[0] * 14;
  3329. */
  3330.         mutomem(hpage_size,vpage_size,&scan_xres,&scan_yres);
  3331.             page_MFDB.fd_addr = page_ptr;         /* Preview address MFDB */
  3332.  
  3333.         mutopage(hpage_size,vpage_size,&mxres,&myres,1);
  3334.  
  3335.               page_area.g_x = page_area.g_y = 0L;
  3336.  
  3337.         gsx_moff();
  3338.               vsf_interior(shandle,0);            /* Set to Solid   */
  3339.  
  3340.               GDvq_extnd(mhandle,0,intout,mxres,myres,&page_ptr);        
  3341.  
  3342.     }
  3343.     else
  3344.     alert_cntre(ALERT33);    /* not enough memory */
  3345.  
  3346. }
  3347.  
  3348.  
  3349. /* kludge for startup.c - adjustdpi() */
  3350. set_ad_dpi()
  3351. {
  3352.    set_int(ad_dpi,HDPIDAT,95);
  3353.    set_int(ad_dpi,VDPIDAT,95);
  3354. }
  3355.  
  3356.  
  3357.  
  3358.  
  3359.  
  3360. /**************************************************************************/
  3361. /*                                      */
  3362. /**************************************************************************/
  3363. do_about()
  3364. {
  3365.     int x,y,w,h;
  3366.     int sx,sy,sw,sh;
  3367.     int button;
  3368.  
  3369.     form_center(ad_deskset,&x,&y,&w,&h);
  3370.     form_center(ad_credits,&sx,&sy,&sw,&sh);
  3371.  
  3372.     form_dial(0,0,0,36,36,x,y,w,h);
  3373.     objc_draw(ad_deskset,0,MAX_DEPTH,x,y,w,h);
  3374.  
  3375.     do
  3376.     {
  3377.       button = form_do(ad_deskset,0);
  3378.       button &= 0x7fff;
  3379.  
  3380.       if(button == DTOUCH)
  3381.       {
  3382.         objc_draw(ad_credits,0,MAX_DEPTH,sx,sy,sw,sh);    
  3383.     button = form_do(ad_credits,0);
  3384.     button = OK;
  3385.       }
  3386.  
  3387.     }while(button != OK);
  3388.     form_dial(3,0,0,3,36,x,y,w,h);
  3389.  
  3390.     force_blit_redraw(0);    /* normal redraw with blits...*/
  3391.            
  3392. }
  3393.  
  3394.  
  3395.  
  3396. /**************************************************************************/
  3397. /* Function: do_info()                                */
  3398. /* Description: Handle information dialog box                  */
  3399. /**************************************************************************/
  3400. do_info()
  3401. {
  3402.     int x,y,w,h;
  3403.     int button;
  3404.     register int i;
  3405.     int dtxtflag;
  3406.     int dgflag;
  3407.     register OBJECT *slider;
  3408.     register OBJECT *sldbox;
  3409.     int    value;
  3410.     int x_box,y_box;
  3411.     int mov_dir;
  3412.     int mx,my;
  3413.     int dummy;
  3414.     int numpages;
  3415.     int pagenum;
  3416.     int tmppage;
  3417.     PAGE *xcurpage;
  3418.     PAGE *xpagehd;
  3419.     register REGION *rptr;
  3420.     int dwhat;
  3421.     int dtype;
  3422.  
  3423.     active_prim = FALSE;
  3424.     numpages = 0;
  3425.     tmppage = curr_page;
  3426.     xpagehd = pagehd;
  3427.     xcurpage = curpage;
  3428.     if(get_fpage(&pagenum))
  3429.     {
  3430.        numpages++;
  3431.        while(get_npage(&pagenum))       
  3432.                 numpages++;
  3433.     }
  3434.     curr_page = tmppage;
  3435.     pagehd = xpagehd;
  3436.     curpage = xcurpage;
  3437.     set_int(ad_info,DOCPAGE,numpages);
  3438.     tdinfo_ptr = gdinfo_ptr = ttdinfo_ptr = tgdinfo_ptr = cgdinfo_ptr = 0L;
  3439.  
  3440.     for(i=DI1;i<=DI10;i++)
  3441.        set_tedit(ad_info,i,tmpflname);
  3442.  
  3443.     if(region_ptr)        /* if a region is selected already     */
  3444.     {                    /* So show file only related to region */
  3445.        rptr = region_ptr;
  3446.        ctdinfo_ptr = 0L;        /* clipboard text, always null */
  3447.        cgdinfo_ptr = 0L;        /* clipboard graphics null     */
  3448.  
  3449.        if(tmplate_flag)            /* Is it a base page region?   */
  3450.        {                /* yes...template region       */
  3451.       dwhat = DITMPLTE;
  3452.       tdinfo_ptr = 0L;        /* document ptrs are null      */
  3453.           gdinfo_ptr = 0L;
  3454.       if(rptr->type)        /* graphic region?           */
  3455.       {                /* Yes...               */
  3456.         ttdinfo_ptr = 0L;     /* Zero out text ptr           */
  3457.         tgdinfo_ptr = get_grfname(rptr);
  3458.         dtype = DIGRAPH;
  3459.       }
  3460.       else                /* No..It's a text region      */
  3461.       {
  3462.         tgdinfo_ptr = 0L;     /* Zero out graphic ptr        */
  3463.         ttdinfo_ptr = 0L;
  3464.         
  3465.         if(rptr->artptr)
  3466.          {
  3467.           ttdinfo_ptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3468.           strcpy(ttdinfo_ptr->txtptr,rptr->artptr->filename);
  3469.               ttdinfo_ptr->next = 0L;
  3470.           ttdinfo_ptr->prev = 0L;
  3471.         }
  3472.             dtype = DITEXT;
  3473.       }
  3474.        }
  3475.        else                /* document region             */
  3476.        {
  3477.       dwhat = DIDOC;
  3478.       ttdinfo_ptr = 0L;        /* template ptrs are null      */
  3479.       tgdinfo_ptr = 0L;
  3480.       if(rptr->type)        /* graphic region ?           */
  3481.       {                /* Yes...               */
  3482.         tdinfo_ptr = 0L;    /* Zero out the text ptr       */
  3483.         gdinfo_ptr = get_grfname(rptr);
  3484.         dtype = DIGRAPH;
  3485.       }
  3486.       else                /* No...It's a text region     */
  3487.       {
  3488.         gdinfo_ptr = 0L;    /* Zero out the graphic ptr    */
  3489.         tdinfo_ptr = 0L;
  3490.         if(rptr->artptr)
  3491.         {
  3492.           tdinfo_ptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3493.           strcpy(tdinfo_ptr->txtptr,rptr->artptr->filename);
  3494.               tdinfo_ptr->next = 0L;
  3495.           tdinfo_ptr->prev = 0L;
  3496.         }
  3497.         dtype = DITEXT;
  3498.       }
  3499.        }
  3500.        region_ptr = gl_region_ptr = gl_grregion_ptr = 0L;
  3501.     }
  3502.     else                   /*show ALL text and graphic files*/
  3503.     {
  3504.        dtxtflag = set_dtext();        /* Document Text           */
  3505.        dgflag = set_dgraphics();    /* Document Graphics           */
  3506.        ctdinfo_ptr = 0L;        /* clipboard text, always null */
  3507.        set_dtmplate();            /* Template Graphics and Text  */
  3508.        set_dclipboard();        /* Clipboard Graphics           */
  3509.        dwhat = DIDOC;
  3510.        dtype = DITEXT;
  3511.     }
  3512.  
  3513.  
  3514.     for(i=DIDOC;i<=DICLIP;i++)
  3515.         ad_info[i].ob_state = NORMAL;
  3516.     ad_info[info_what + dwhat].ob_state = SELECTED;
  3517.  
  3518.     ad_info[DITEXT].ob_state = NORMAL;
  3519.     ad_info[DIGRAPH].ob_state = NORMAL;
  3520.     ad_info[info_type + dtype].ob_state = SELECTED;
  3521.  
  3522.  
  3523.     form_center(ad_info,&x,&y,&w,&h);
  3524.     form_dial(0,0,0,36,36,x,y,w,h);
  3525.     form_dial(1,0,0,36,36,x,y,w,h);
  3526.  
  3527.  
  3528.     maincount = dtcount = get_dinfo_items(tdinfo_ptr);
  3529.     dgcount = get_dinfo_items(gdinfo_ptr);
  3530.     ttcount = get_dinfo_items(ttdinfo_ptr);
  3531.     tgcount = get_dinfo_items(tgdinfo_ptr);
  3532.     cgcount = get_dinfo_items(cgdinfo_ptr);
  3533.     ctcount = 0;    
  3534.  
  3535.  
  3536.  
  3537.     objc_draw(ad_info,ROOT,MAX_DEPTH,x,y,w,h);
  3538.     type_info(dtype,dwhat);
  3539.     objc_draw(ad_info,DBOX,1,x,y,w,h);   
  3540.  
  3541.     slider = &ad_info[DISLIDE];
  3542.     sldbox = &ad_info[DIVERT];
  3543.     curfirst_art = 0;
  3544.  
  3545.     do
  3546.     {
  3547.        button = form_do(ad_info,0);
  3548.        button &= 0x7fff;
  3549.  
  3550.        switch(button)
  3551.        {
  3552.        case DIUP:    if(!slider->ob_y)
  3553.                      break;
  3554.             hndl_dlist(curfirst_art,-1);
  3555.             break;
  3556.  
  3557.        case DIDOWN:    if(slider->ob_y >= sldbox->ob_height - slider->ob_height)
  3558.                             break;    
  3559.             hndl_dlist(curfirst_art,1);
  3560.             break;
  3561.  
  3562.  
  3563.        case DISLIDE:value = graf_slidebox(ad_info,DIVERT,DISLIDE,1);
  3564.             value = scaler(value,maincount-INFOMAX,1000);
  3565.             hndl_dlist(value,0);
  3566.             break;
  3567.  
  3568.        case DIVERT: graf_mkstate(&mx,&my,&dummy,&dummy);
  3569.             objc_offset(ad_info,DIVERT,&x_box,&y_box);
  3570.             if(my > y_box + slider->ob_y)
  3571.                     mov_dir = INFOMAX;
  3572.             else
  3573.                mov_dir = -INFOMAX;
  3574.             hndl_dlist(curfirst_art,mov_dir);
  3575.             break;
  3576.  
  3577.        case DIDOC:
  3578.        case DITMPLTE:
  3579.        case DICLIP:   type_info(info_type+DITEXT,button);
  3580.               info_what = button - DIDOC;
  3581.               objc_draw(ad_info,DBOX,1,x,y,w,h);   
  3582.               break;
  3583.  
  3584.  
  3585.        case DITEXT:
  3586.        case DIGRAPH:  type_info(button,info_what+DIDOC);
  3587.               info_type = button - DITEXT;
  3588.               objc_draw(ad_info,DBOX,1,x,y,w,h);   
  3589.               break;
  3590.        default:
  3591.            break;
  3592.        }
  3593.  
  3594.     }while(button != DIEXIT);
  3595.     form_dial(2,0,0,36,36,x,y,w,h);
  3596.     form_dial(3,0,0,3,36,x,y,w,h);
  3597.     info_what = info_type = 0;    /* set to first buttons */
  3598.     ad_info[button].ob_state = NORMAL;
  3599.  
  3600.     cleanup();
  3601.     force_blit_redraw(0);
  3602. }
  3603.  
  3604.  
  3605.  
  3606.  
  3607. /**************************************************************************/
  3608. /**************************************************************************/
  3609. set_dtext()
  3610. {
  3611.     register ARTICLE *darthd;
  3612.     register DINFO   *tptr;
  3613.     DINFO   *newptr;
  3614.  
  3615.     darthd = ((tmplate_flag)?(tarthd):(arthd));
  3616.  
  3617.     if(darthd)
  3618.     {
  3619.        tptr = tdinfo_ptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));        
  3620.        strcpy(tptr->txtptr,darthd->filename);
  3621.        tptr->next = 0L;
  3622.        tptr->prev = 0L;
  3623.  
  3624.        while(darthd->nextart)
  3625.        {
  3626.          darthd = darthd->nextart;
  3627.          newptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3628.          tptr->next = newptr;
  3629.          tptr->next->prev = tptr;
  3630.          tptr = tptr->next;
  3631.          tptr->next = 0L;
  3632.          strcpy(tptr->txtptr,darthd->filename);
  3633.        }
  3634.        return(1);    /* at least 1 or more text articles*/
  3635.     }
  3636.     return(0);    /* no text articles */
  3637. }
  3638.  
  3639.  
  3640.  
  3641.  
  3642. /**************************************************************************/
  3643. /**************************************************************************/
  3644. set_dgraphics()
  3645. {
  3646.     PAGE    *dpagehd;
  3647.     int     tmppage;
  3648.     PAGE    *tppage;
  3649.  
  3650.     dpagehd = ((tmplate_flag)?(tpagehd):(pagehd));
  3651.  
  3652.     tppage = pagehd;
  3653.     pagehd = dpagehd;
  3654.     tmppage = curr_page;
  3655.  
  3656.     gdinfo_ptr = set_info_graphics();
  3657.  
  3658.     curr_page = tmppage;
  3659.     region_ptr = gl_region_ptr = gl_grregion_ptr = 0L;
  3660.     curpage = pagehd = tppage;
  3661. }
  3662.  
  3663.  
  3664.  
  3665. /**************************************************************************/
  3666. /**************************************************************************/
  3667. cleanup()
  3668. {
  3669.     if(tdinfo_ptr)    /* DOCS TEXT MALLOC? */
  3670.     cleanse(tdinfo_ptr);
  3671.  
  3672.     if(gdinfo_ptr)    /* DOCS GRAPHIC MALLOC?*/
  3673.     cleanse(gdinfo_ptr);
  3674.  
  3675.     if(ttdinfo_ptr)    /* template TEXT malloc?*/
  3676.     cleanse(ttdinfo_ptr);
  3677.  
  3678.     if(tgdinfo_ptr)    /* template GRAPHIC malloc?*/
  3679.     cleanse(tgdinfo_ptr);    
  3680.  
  3681.     if(cgdinfo_ptr)    /* clipboard Graphic malloc*/
  3682.     cleanse(cgdinfo_ptr);
  3683.     tdinfo_ptr = gdinfo_ptr = ttdinfo_ptr = tgdinfo_ptr = cgdinfo_ptr = 0L;
  3684. }
  3685.  
  3686.  
  3687.  
  3688.  
  3689. /**************************************************************************/
  3690. /**************************************************************************/
  3691. cleanse(tptr)
  3692. register DINFO *tptr;
  3693. {
  3694.    register DINFO *pptr;
  3695.  
  3696.    while(tptr->next)
  3697.     tptr = tptr->next;
  3698.    pptr = tptr->prev;
  3699.    free(tptr);
  3700.    while(pptr)
  3701.    {
  3702.      tptr = pptr;
  3703.      pptr = tptr->prev;
  3704.      free(tptr);
  3705.    }
  3706. }
  3707.  
  3708.  
  3709.  
  3710. /**************************************************************************/
  3711. /**************************************************************************/
  3712. draw_text(tptr)
  3713. register DINFO *tptr;
  3714. {
  3715.   register int i;
  3716.  
  3717.   i = DI1;
  3718.   while((i<=DI10) && tptr)
  3719.   {
  3720.      set_tedit(ad_info,i,tptr->txtptr);
  3721.      tptr = tptr->next;
  3722.      i++;
  3723.   }
  3724. }
  3725.  
  3726.  
  3727.  
  3728. /**************************************************************************/
  3729. /**************************************************************************/
  3730. type_info(type,what)
  3731. int type;
  3732. int what;
  3733. {
  3734.    register DINFO *tptr;
  3735.    register int i;
  3736.    register int tot_names;
  3737.   
  3738.    for(i=DI1;i<=DI10;i++)
  3739.        set_tedit(ad_info,i,tmpflname);
  3740.    
  3741.    switch(what)
  3742.    {
  3743.      case DIDOC:     tptr=((type==DITEXT)?(tdinfo_ptr):(gdinfo_ptr));
  3744.             tot_names=((type==DITEXT)?(dtcount):(dgcount));
  3745.             break;
  3746.  
  3747.     case DITMPLTE:  tptr=((type==DITEXT)?(ttdinfo_ptr):(tgdinfo_ptr));
  3748.             tot_names=((type==DITEXT)?(ttcount):(tgcount));
  3749.             break;
  3750.  
  3751.     case DICLIP:    tptr=((type==DITEXT)?(ctdinfo_ptr):(cgdinfo_ptr));
  3752.             tot_names=((type==DITEXT)?(ctcount):(cgcount));
  3753.             break;
  3754.    }
  3755.    maincount = tot_names;
  3756.    curdinfo  = tptr;
  3757.    curfirst_art = 0;
  3758.    init_slider(ad_info,tot_names,DISLIDE,DIVERT,&hslider,INFOMAX);
  3759.    do_slider(ad_info,DISLIDE,DIVERT,hslider,tot_names,0,INFOMAX);
  3760.    objc_draw(ad_info,DIVERT,1,aworkx,aworky,aworkw,aworkh);     /* draw it */
  3761.    draw_text(tptr);
  3762. }
  3763.  
  3764.  
  3765.  
  3766.  
  3767. /**************************************************************************/
  3768. /* Function: Setup DINFO structure for tmplate                   */
  3769. /**************************************************************************/
  3770. set_dtmplate()
  3771. {
  3772.    register DINFO *tptr;
  3773.  
  3774.    DINFO *mptr;
  3775.    DINFO *newptr;
  3776.    DINFO *tempptr;
  3777.  
  3778.    PAGE *bpagehd;
  3779.    int  bcurr_page;
  3780.    PAGE *bcurpage;
  3781.  
  3782.    
  3783.    ttdinfo_ptr = 0L;
  3784.    tgdinfo_ptr = 0L;
  3785.    xarthd = 0L;
  3786.    xarthd = ltarthd;
  3787.  
  3788.    if(xarthd)                /* left template text */
  3789.    {
  3790.       tptr = ttdinfo_ptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3791.       strcpy(tptr->txtptr,xarthd->filename);
  3792.       tptr->next = 0L;
  3793.       tptr->prev = 0L;
  3794.       
  3795.       while(xarthd->nextart)
  3796.       {
  3797.     xarthd = xarthd->nextart;
  3798.     newptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3799.     tptr->next = newptr;
  3800.     tptr->next->prev = tptr;
  3801.     tptr = tptr->next;
  3802.     tptr->next = 0L;
  3803.     strcpy(tptr->txtptr,xarthd->filename);
  3804.       }
  3805.    }
  3806.  
  3807.    xarthd = 0L;
  3808.    xarthd = rtarthd;
  3809.    if(xarthd)                /* right template text */
  3810.    {                    
  3811.       newptr = mptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3812.       if(!ttdinfo_ptr)
  3813.       {
  3814.        tptr = ttdinfo_ptr = mptr;
  3815.            strcpy(tptr->txtptr,xarthd->filename);
  3816.            tptr->next = 0L;
  3817.            tptr->prev = 0L;
  3818.       }
  3819.       else
  3820.       {
  3821.     tptr->next = newptr;
  3822.     tptr->next->prev = tptr;
  3823.     tptr = tptr->next;
  3824.     tptr->next = 0L;
  3825.     strcpy(tptr->txtptr,xarthd->filename);
  3826.       }
  3827.  
  3828.       while(xarthd->nextart)
  3829.       {
  3830.     xarthd = xarthd->nextart;
  3831.     newptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3832.     tptr->next = newptr;
  3833.     tptr->next->prev = tptr;
  3834.     tptr = tptr->next;
  3835.     tptr->next = 0L;
  3836.     strcpy(tptr->txtptr,xarthd->filename);
  3837.  
  3838.       }      
  3839.    }
  3840.  
  3841.    bpagehd = pagehd;
  3842.    bcurr_page = curr_page;
  3843.    bcurpage = curpage;
  3844.  
  3845.    pagehd = left_tmplate;
  3846.    tgdinfo_ptr = set_info_graphics();   
  3847.    
  3848.    
  3849.    pagehd = right_tmplate;
  3850.    tempptr = set_info_graphics();
  3851.  
  3852.    if(tgdinfo_ptr)
  3853.    {
  3854.       if(tempptr)
  3855.       {
  3856.         tptr = tgdinfo_ptr;
  3857.         while(tptr->next)
  3858.        tptr = tptr->next;
  3859.     tptr->next = tempptr;
  3860.       }
  3861.    }
  3862.    else
  3863.     tgdinfo_ptr = tempptr;
  3864.    
  3865.    curr_page = bcurr_page;
  3866.    pagehd = bpagehd;
  3867.    curpage = bcurpage;
  3868.    region_ptr = gl_region_ptr = gl_grregion_ptr = 0L;
  3869. }
  3870.  
  3871.  
  3872.  
  3873.  
  3874. /**************************************************************************/
  3875. /**************************************************************************/
  3876. DINFO *set_info_graphics()
  3877. {
  3878.     int     pagenum;
  3879.     register unsigned long    rptr;
  3880.     int     graf_flag;
  3881.     int     murect[4];    
  3882.     register int     op;        /* opcode */
  3883.     int     cnt;    /* count  */
  3884.     int     mode;    /* wmode  */
  3885.     int     flag;
  3886.     register DINFO   *tptr;
  3887.     DINFO   *newptr;
  3888.     DINFO   *xptr;
  3889.  
  3890.     flag = FALSE;
  3891.     xptr = 0L;
  3892.     if(get_fpage(&pagenum))
  3893.     {
  3894.      do
  3895.      {
  3896.     rptr = get_fregion(pagenum,&murect[0],&murect[1],
  3897.                &murect[2],&murect[3],&graf_flag);
  3898.         while(rptr)
  3899.     {
  3900.            if(graf_flag)
  3901.        {
  3902.          op = get_fprimitive(rptr,&cnt,&mode);
  3903.          while(op != -1)
  3904.          {
  3905.         if(op == 2)    /* only want filenames of graphics*/
  3906.         {
  3907.           if(!flag)    /* not even 1 malloc'ed yet */
  3908.           {
  3909.             tptr=xptr=(unsigned long)get_lmem((long)sizeof(struct dinfo));
  3910.             strcpy(tptr->txtptr,&ptsarray[5]);
  3911.             tptr->next = 0L;
  3912.             tptr->prev = 0L;
  3913.             flag = TRUE;
  3914.           }
  3915.           else        /* add to linked list       */
  3916.           {
  3917.                 newptr=(unsigned long)get_lmem((long)sizeof(struct dinfo));            
  3918.                  tptr->next = newptr;
  3919.                  tptr->next->prev = tptr;
  3920.                  tptr = tptr->next;
  3921.                  tptr->next = 0L;
  3922.             strcpy(tptr->txtptr,&ptsarray[5]);
  3923.           }  
  3924.  
  3925.         }
  3926.         op = get_nprimitive(&cnt,&mode);
  3927.          }
  3928.        }
  3929.        rptr = get_nregion(&murect[0],&murect[1],
  3930.                   &murect[2],&murect[3],&graf_flag);
  3931.     }
  3932.     
  3933.      }while(get_npage(&pagenum));
  3934.     }
  3935.     return(xptr);
  3936.  
  3937. }
  3938.  
  3939.  
  3940.  
  3941.  
  3942. /**************************************************************************/
  3943. /**************************************************************************/
  3944. set_dclipboard()
  3945. {
  3946.    PAGE *bpagehd;
  3947.    int  bcurr_page;
  3948.    PAGE *bcurpage;
  3949.  
  3950.    bpagehd = pagehd;
  3951.    bcurr_page = curr_page;
  3952.    bcurpage = curpage;
  3953.  
  3954.    pagehd = clippage;
  3955.    if(pagehd)
  3956.       cgdinfo_ptr = set_info_graphics();   
  3957.    
  3958.    curr_page = bcurr_page;
  3959.    pagehd = bpagehd;
  3960.    curpage = bcurpage;
  3961.    region_ptr = gl_region_ptr = gl_grregion_ptr = 0L;
  3962.  
  3963. }
  3964.  
  3965.  
  3966. get_dinfo_items(tptr)
  3967. register DINFO *tptr;
  3968. {
  3969.     register int i;
  3970.  
  3971.     i = 0;
  3972.     while(tptr)
  3973.     {
  3974.     i++;
  3975.     tptr = tptr->next;
  3976.     }
  3977.     return(i);
  3978. }
  3979.  
  3980.  
  3981.  
  3982.  
  3983.  
  3984.  
  3985. hndl_dlist(begname,movdir)
  3986. int begname;
  3987. int movdir;
  3988. {
  3989.    gsx_moff();
  3990.    curfirst_art = dscroll(maincount,begname,movdir);
  3991.    do_slider(ad_info,DISLIDE,DIVERT,hslider,maincount,curfirst_art,INFOMAX);
  3992.    gsx_mon();
  3993. }
  3994.  
  3995.  
  3996.  
  3997.  
  3998.  
  3999. dscroll(total_names,startname,amount)
  4000. int total_names;
  4001. int startname;
  4002. int amount;
  4003. {
  4004.   register int i,j;
  4005.   int textobj,x,y;
  4006.   long scrmfdb;
  4007.  
  4008.   scrmfdb = 0L;
  4009.  
  4010.   i = startname + amount;
  4011.   j = total_names - INFOMAX;
  4012.  
  4013.   if(i<0 || j<0)
  4014.     i = 0;
  4015.   if(j<0)
  4016.     j = 0;
  4017.   if(i>j)
  4018.     i = j;
  4019.  
  4020.   set_info_ptrs(i);
  4021.  
  4022.   if(amount != -1 && amount != 1)
  4023.   {                /* do page scrolling */
  4024.     objc_draw(ad_info,DBOX,1,aworkx,aworky,aworkw,aworkh);
  4025.     return(i);
  4026.   }
  4027.  
  4028.   if(i==startname)        /* reject unnecessary single scroll */
  4029.     return(i);        /* else we do a single line scroll  */
  4030.  
  4031.   objc_offset(ad_info,DI1,&x,&y);
  4032.  
  4033.    ptsin[0] = x;            /* init clipping x,y,w,h */
  4034.    ptsin[1] = y;
  4035.    ptsin[2] = x+ad_info[DI1].ob_width;
  4036.    ptsin[3] = y+gl_hchar*INFOMAX-1;
  4037.  
  4038.    ptsin[4] = x;            /* init blit destination */
  4039.    ptsin[5] = y;
  4040.    ptsin[6] = ptsin[2];
  4041.    ptsin[7] = ptsin[3];
  4042.  
  4043.    vs_clip(shandle,1,ptsin);
  4044.  
  4045.    if(amount < 0)
  4046.    {                /* - if going up -Up Arrow!!!*/
  4047.       ptsin[1] -= gl_hchar;    /* src y */
  4048.       ptsin[3] += gl_hchar;    /* src h*/
  4049.       ptsin[7] += gl_hchar;    
  4050.       textobj = ad_info[DBOX].ob_head;
  4051.       
  4052.    }
  4053.    else                /* going down -Down Arrow!! */
  4054.    {
  4055.       ptsin[3] += gl_hchar;
  4056.       ptsin[5] -= gl_hchar;
  4057.       ptsin[7] -= gl_hchar;
  4058.       textobj = ad_info[DBOX].ob_tail;
  4059.    }
  4060.  
  4061.    gsx_moff();
  4062.    vro_cpyfm(shandle,3,ptsin,&scrmfdb,&scrmfdb);
  4063.    objc_draw(ad_info,textobj,0,aworkx,aworky,aworkw,aworkh);
  4064.    gsx_mon();
  4065.    return(i);
  4066. }
  4067.  
  4068.  
  4069.  
  4070.  
  4071.  
  4072. set_info_ptrs(pos)
  4073. register int pos;
  4074. {
  4075.    register int i;
  4076.    register DINFO *tptr;
  4077.  
  4078.    for(i=DI1;i<=DI10;i++)
  4079.     set_tedit(ad_info,i,tmpflname);
  4080.  
  4081.    tptr = curdinfo;
  4082.  
  4083.    i = 0;        /* dangerous, eh?*/
  4084.    while((i!=pos) && tptr)
  4085.    {
  4086.     i++;
  4087.     tptr = tptr->next;
  4088.    }
  4089.  
  4090.    if(tptr)
  4091.       draw_text(tptr);
  4092. }
  4093.  
  4094.  
  4095.  
  4096.  
  4097.  
  4098.  
  4099. clr_attr_flag()
  4100. {
  4101.    register int i;
  4102.  
  4103.    for(i=0;i<=22;i++)
  4104.         attr_flag[i] = 0;
  4105. }
  4106.  
  4107.  
  4108.  
  4109.  
  4110. copy_attr(attr)
  4111. register struct txtattr *attr;
  4112. {
  4113.    register int i;
  4114.  
  4115.    for(i=0;i<= 22;i++)
  4116.    {
  4117.     if(attr_flag[i])
  4118.     {
  4119.         switch(i)
  4120.         {
  4121.         case 0: attr->llen   = gltxtattr.llen;
  4122.             break;
  4123.  
  4124.         case 1: attr->depth  = gltxtattr.depth;
  4125.             break;
  4126.  
  4127.         case 2: attr->lnsp   = gltxtattr.lnsp;
  4128.             break;
  4129.  
  4130.         case 3: attr->ptsz   = gltxtattr.ptsz;
  4131.             break;
  4132.  
  4133.         case 4: attr->ssiz   = gltxtattr.ssiz;
  4134.             break;
  4135.  
  4136.         case 5: attr->font   = gltxtattr.font;
  4137.             break;
  4138.  
  4139.         case 6: attr->mcomp  = gltxtattr.mcomp;
  4140.             break;
  4141.  
  4142.         case 7: attr->acomp  = gltxtattr.acomp;
  4143.             break;
  4144.  
  4145.         case 8: attr->kernmd = gltxtattr.kernmd;
  4146.             break;
  4147.  
  4148.         case 9: attr->hypmd  = gltxtattr.hypmd;
  4149.             break;
  4150.  
  4151.         case 10: attr->nsuchyp  = gltxtattr.nsuchyp;
  4152.             break;
  4153.  
  4154.         case 11: attr->nbefhyp  = gltxtattr.nbefhyp;
  4155.             break;
  4156.  
  4157.         case 12: attr->nafthyp  = gltxtattr.nafthyp;
  4158.             break;
  4159.  
  4160.         case 13: attr->ltsmd  = gltxtattr.ltsmd;
  4161.             break;
  4162.  
  4163.         case 14: attr->plts   = gltxtattr.plts;
  4164.             break;
  4165.  
  4166.         case 15: attr->nlts   = gltxtattr.nlts;
  4167.             break;
  4168.  
  4169.         case 16: attr->minsp  = gltxtattr.minsp;
  4170.             break;
  4171.  
  4172.         case 17: attr->prfsp  = gltxtattr.prfsp;
  4173.             break;
  4174.  
  4175.         case 18: attr->maxsp  = gltxtattr.maxsp;
  4176.             break;
  4177.  
  4178.         case 19: attr->rvomd  = gltxtattr.rvomd;
  4179.             break;
  4180.  
  4181.         case 20: attr->psimd  = gltxtattr.psimd;
  4182.             break;
  4183.  
  4184.         case 21: attr->jstmd  = gltxtattr.jstmd;
  4185.             break;
  4186.  
  4187.         case 22: attr->scoff  = gltxtattr.scoff;
  4188.             break;
  4189.         }
  4190.     }
  4191.    }
  4192. }
  4193.  
  4194.  
  4195.  
  4196. /*************************************************************/
  4197. /* Get filename of graphics for do_info...             */
  4198. /* specifically, only for when a region is selected...       */
  4199. /*************************************************************/
  4200. DINFO *get_grfname(rptr)
  4201. REGION *rptr;
  4202. {
  4203.     int cnt,mode;
  4204.     register int op;
  4205.     int flag;
  4206.     register DINFO *tptr;
  4207.     DINFO *xptr;
  4208.     DINFO *newptr;
  4209.  
  4210.     flag = FALSE;
  4211.     xptr = 0L;
  4212.     op = get_fprimitive(rptr,&cnt,&mode);
  4213.     while(op != -1)
  4214.     {
  4215.        if(op == 2)    /* Only want filenames of graphics*/
  4216.        {
  4217.           if(!flag)    /* not even 1 malloc'ed yet...    */
  4218.       {
  4219.           tptr = xptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  4220.               strcpy(tptr->txtptr,&ptsarray[5]);
  4221.           tptr->next = 0L;
  4222.               tptr->prev = 0L;
  4223.           flag = TRUE;
  4224.           }
  4225.           else
  4226.           {
  4227.           newptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  4228.           tptr->next = newptr;
  4229.               tptr->next->prev = tptr;
  4230.               tptr = tptr->next;
  4231.               tptr->next = 0L;
  4232.               strcpy(tptr->txtptr,&ptsarray[5]);
  4233.           }
  4234.        }
  4235.        op = get_nprimitive(&cnt,&mode);
  4236.     }
  4237.     
  4238.     return(xptr);
  4239. }
  4240.